Blog de programación, donde ademas de encontrar pequeños programas en C# tambien publicaré pequeñas ayudas para SQL Server

Vladimir Miranda - vladivirus666@gmail.com. Con la tecnología de Blogger.

miércoles, 5 de abril de 2017

Desarrollo en Capas (Asp.NET) Parte II


En esta segunda parte del desarrollo en capas vamos a ver el código que tendrá nuestra capa de Acceso a Datos (proyecto AccesoDatos).

Si aún no has visto la primera parte de este artículo; puedes revisarlo dando Clic aquí.

En esta capa, vamos a todas las consultas que realizamos hacia la BD, para lo cual vamos a utilizar LINQ el cual nos ayudará a escribir consultas contra el método conceptual (Entity Framework) mediante Visual C# (más información aquí).

[sourcecode language='csharp'  padlinenumbers='true']
namespace AccesoDatos { public class AEC_DAL_Trabajador { } }
[/sourcecode]

Una vez realizado esto, voy a empezar creando un metodo del tipo “ConsultarTrabajador” que me va a devolver un List<> del tipo Trabajador, el primer problema que se me presenta al crear este método es que VS me genera un error ya que, de acuerdo al mensaje exacto:

“No se puede encontrar el tipo o el nombre de espacio de nombres ‘Trabajador’".

Para solucionar este inconveniente tenemos dos formas:

En la parte superior incluimos un using que haga referencia a nuestro proyecto Entidades

[sourcecode language='csharp' ]
using Entidades;
[/sourcecode]

Nos colocamos sobre el error y damos clic para que Intellisense nos muestre un pequeño “guión” de color azul (que en la imagen esta rodeado de rojo)

 https://lh6.googleusercontent.com/iSAmwg530NtB7lppe7VLuVqinpYiG_SQyqo7eitOFkVKkiiOnJeO1X2_JmG19aP0Ux90IqNodyqJfJmKuRHg=w1440-h789

Al colocarnos sobre el "guión" nos muestra un icono de color plomo, damos clic en el y nos despliega la ayuda, en mi caso voy a dar clic en using Entidades;

https://lh5.googleusercontent.com/unk8_L56iHdIcxKphpj7EyQag25w-CLIrZjSt8o-vQ7X776zhI-B1nY64-N9FOHgcX2AM1aKL-Tm7x-5dTt2=w1440-h789

Una vez terminada mi clase quedará de esta forma:

[sourcecode language='csharp' ]
using Entidades; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace AccesoDatos 
{ 
   public class AEC_DAL_Trabajador 
   { 
      public List ConsultaTrabajador() 
      { 
         using (TrabajadorEntities db = new TrabajadorEntities()) 
         { 
            return db.Trabajador.ToList(); 
         } 
      }
   }
}
[/sourcecode]

Para continuar, vamos a generar por cada Entidad en nuestro proyecto Entidades una clase independiente en nuestro proyecto AccesoDatos, voy a empezar con una clase a la que llamaré AEC_DAL_Trabajador; tambien cambiaré su atributo a pública, quedando de esta manera.

[sourcecode language='csharp' ]
using Entidades; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace AccesoDatos 
{ 
   public class AEC_DAL_Departamento 
   { 
      public List<Departamento> ConsultarDepartamento() 
      { 
         using(TrabajadorEntities db = new TrabajadorEntities()) 
         { 
            return db.Departamento.ToList(); 
         } 
      } 
      
      public Departamento ConsultarDepartamentoPorCodigo(decimal codigoPrincipal) 
      { 
         using (TrabajadorEntities db = new TrabajadorEntities()) 
         { 
            var query = (from dep in db.Departamento where dep.DEP_CODIGO == codigoPrincipal select dep).SingleOrDefault(); 
            return query; 
         } 
      } 

      public Departamento InsertarDepartamento(Departamento objetoDepartamento) 
      { 
         using (TrabajadorEntities db = new TrabajadorEntities()) 
         { 
             db.Departamento.Add(objetoDepartamento); 
             db.SaveChanges(); 
             return objetoDepartamento; 
          } 
      } 

		public List<Departamento> InsertarListaDepartamento(List<Departamento> listaDepartamento) 
		{ 
			using (TrabajadorEntities db = new TrabajadorEntities()) 
			{ 
				db.Departamento.AddRange(listaDepartamento); 
				db.SaveChanges(); 
				return listaDepartamento; 
			} 
		} 

		public Departamento ActualizarDepartamentoPorCodigo(Departamento objetoDepartamento) 
		{ 
			using (TrabajadorEntities db = new TrabajadorEntities()) 
			{ 
				var query = (from dep in db.Departamento where dep.DEP_CODIGO == objetoDepartamento.DEP_CODIGO select dep).SingleOrDefault(); 
				query.DEP_ESTADO = objetoDepartamento.DEP_ESTADO; 
				query.DEP_NOMBRE = objetoDepartamento.DEP_NOMBRE; 
				db.SaveChanges(); 
				return query; 
			} 
		} 

		public string EliminarDepartamento(decimal codigoPrincipal) 
		{ 
			try 
			{ 
				using (TrabajadorEntities db = new TrabajadorEntities()) 
				{ 
					var query = (from dep in db.Departamento where dep.DEP_CODIGO == codigoPrincipal select dep).SingleOrDefault(); 
					db.Departamento.Remove(query); 
					db.SaveChanges(); 
					return "Eliminado"; 
				} 
			} 
			catch (Exception err) 
			{ 
				return err.Message; 
			} 
		} 
	} 
}
[/sourcecode]
Una vez realizado este proceso, lo que deseo es consultar un Trabajador y que me indique el departamento y el cargo. lo que se haria en SQL (en mi caso) es generar una vista que me permita traer esa información:
[sourcecode language='sql' ]
elect TRA_CODIGO, DEP_CODIGO, CAR_CODIGO, TRA_NOMBRE, TRA_APELLIDO, TRA_IDENTIFICACION, TRA_TELEFONO, DEP_NOMBRE, CAR_NOMBRE from Trabajador TR INNER JOIN Departamento DP ON TR.DEP_CODIGO = DP.DEP_CODIGO INNER JOIN Cargo CG ON TR.CAR_CODIGO = CG.CAR_CODIGO
[/sourcecode]

Pero, la idea de utilizar Entity Framework y LINQ es ahorrarnos este paso y poderlo generar desde el mismo VS; para ello, voy a crearme una clase en el proyecto Entidades, la cual voy a llamar TrabajadorDepartamentoCargo

[sourcecode language='csharp' ]
namespace Entidades 
{ 
   public class TrabajadorDepartamentoCargo 
   { 
      public decimal TRA_CODIGO { get; set; } 
      public Nullable<Decimal> DEP_CODIGO { get; set; } 
      public Nullable<Decimal> CAR_CODIGO { get; set; } 
      public string TRA_NOMBRE { get; set; } 
      public string TRA_APELLIDO { get; set; } 
      public string TRA_IDENTIFICACION { get; set; } 
      public string TRA_TELEFONO { get; set; } 
      public string DEP_NOMBRE { get; set; } 
      public string CAR_NOMBRE { get; set; } 
   } 
}
[/sourcecode]

Una vez con la clase creada el proyecto hasta el momento debe quedarnos de la siguiente manera:

https://lh3.googleusercontent.com/-qyGC1_tpUG4/V7TzcBVBKgI/AAAAAAAAEk4/hMlo-pUOThs/s1600/image%25255B15%25255D.png

Ahora volvemos al proyecto AccesoDatos, en el vamos a crear una clase AEC_DAL_TrabajadorDepartamentoCargo y vamos a incluir un método ConsultarTrabajadorPorIdentificacion el cual tendrá una pequeña modificacion en relación a las consultas realizadas en las otras clases.

[sourcecode language='csharp'  padlinenumbers='true']
using Entidades; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
namespace AccesoDatos 
{ 
   public class AEC_DAL_TrabajadorDepartamentoCargo 
   { 
      public TrabajadorDepartamentoCargo ConsultarTrabajadorPorIdentificacion(string identificacion) 
      { 
         using(TrabajadorEntities db = new TrabajadorEntities()) 
         { 
            var query = (from tra in db.Trabajador where tra.TRA_IDENTIFICACION == identificacion 
                                  select new TrabajadorDepartamentoCargo 
                                  { 
                                     CAR_CODIGO = tra.CAR_CODIGO, 
                                     CAR_NOMBRE = tra.Cargo.CAR_NOMBRE, 
                                     DEP_CODIGO = tra.DEP_CODIGO, 
                                     DEP_NOMBRE = tra.Departamento.DEP_NOMBRE, 
                                     TRA_APELLIDO = tra.TRA_APELLIDO, 
                                     TRA_CODIGO = tra.TRA_CODIGO, 
                                     TRA_IDENTIFICACION = tra.TRA_IDENTIFICACION, 
                                     TRA_NOMBRE = tra.TRA_NOMBRE, 
                                     TRA_TELEFONO = tra.TRA_TELEFONO
                                   }).SingleOrDefault(); 
                                   return query; 
          } 
      }   
   } 
}
[/sourcecode]

Como pueden ver, en la ahora hacemos uso de las propiedades de navegación al solicitar CAR_NOMBRE de la tabla Cargo que esta relacionada con el trabajador y DEP_NOMBRE de la tabla Departamento que esta relacionada con el trabajador.

Y eso sería todo, lo que hicimos en esta parte es agregar una clase por cada entidad (4 clases) en el proyecto AccesoDatos, dentro de cada clase creamos métodos que realizan las consultas a la BD.

En los proximos días continuo con la capa de Negocio

Descargar Proyecto