Entity Framework

download Entity Framework

of 22

  • date post

    30-Oct-2015
  • Category

    Documents

  • view

    236
  • download

    0

Embed Size (px)

Transcript of Entity Framework

CASTRO PECHO REYNALDOARQUITECTURA DE SOFTWAREEntity FrameworkQue es ?ElADO.NETEntity Frameworkes un conjunto deAPIsde acceso a datos para el Microsoft .NET Framework, apuntando a la versin de ADO.NET que se incluye con el.NET Framework 3.5. Fue lanzado como actualizacin separada junto con el Service Pack 1 para el .NET Framework, despus del lanzamiento de tanto el .NET Framework 3.5 y el Visual Studio 2008. Una nueva versin del Entity Framework (v 4.0) ser liberada junto al Visual Studio 2010 y el .NET Framework 4.0.Una entidad delEntity Frameworkes un objeto que tiene una clave representando la clave primaria de una entidad lgica de datastore. Un modelo conceptual Entity Data Model (modelo Entidad-Relacin) es mapeado a un modelo de esquema de datastore. Usando el Entity Data Model, el Framework permite que los datos sean tratados como entidades independientemente de sus representaciones del datastore subyacente.El Entity SQL es un lenguaje similar al SQL para consultar el Entity Data Model (en vez del datastore subyacente). Similarmente, las extensiones del Linq, Linq-to-Entities, proporcionan consultas tipeadas en el Entity Data Model. Las consultas Entity SQL y Linq-to-Entities son convertidas internamente en un Canonical Query Tree que entonces es convertido en una consulta comprensible al datastore subyacente (ej. en SQL en el caso de una base de datos relacional). Las entidades pueden utilizar sus relaciones, y sus cambios enviados de regreso al datastore.

Para qu sirve?Entity Framework (EF) sirve para mapeador objeto-relacional que permite a los desarrolladores de. NET para trabajar con datos relacionales usando objetos de dominio especfico. Se elimina la necesidad de que la mayor parte del cdigo de acceso a datos que los desarrolladores en general tienen que escribir.

Como Implementa El Patrn Repository Entity Framework?Patrones de diseo: RepositoryPara poder implementar el patrn repository y entity framework tenemos que tener los siguientes pasos.Data MapperImaginemos que tenemos un sistema de almacenamiento de datos complejo, algo as como una base de datos. La gestin mediante nuestro lenguaje de programacin preferido de esta informacin, puede resultar compleja y para nada relacionada con la forma de gestionar la informacin dentro de nuestra aplicacin.Por citar un ejemplo ms concreto, no resulta sencillo ni natural, recoger un dato de la una base de datos SQL Server, usando c#. Bsicamente porque el lenguaje c# est pensado para programar orientado a objetos y el motor de SQL Server est pensado para modelos de datos relacionales usando SQL como lenguaje de comunicacin.Una consulta sencilla, que devuelva el nmero de usuarios de nuestro sistema, puede ocupar varias lneas. Y adems, habr que tener en cuenta los errores que puedan surgir:

123456789101112131415try{using(var con = new SqlConnection(connetionString)){using (var cmd = new SqlCommand("select count(*) from [dbo].[Users]", con)){var count = Convert.ToInt32(cmd.ExecuteScalar());return count;}}} catch (Exception ex){// manage exception}

Para que no se complique nuestro cdigo, el seor Fowler nos propone crear una capa dentro de nuestra aplicacin cuya misin sea mover la informacin entre los objetos de c# y la base de datos. Adems esta capa va a aislar el comportamiento de la base de datos, del de nuestros objetos, haciendo que nuestra aplicacin no est acoplada con nuestra fuente de almacenamiento (SQL Server en el ejemplo).

De esta forma crearamos una implementacin simple y genrica de nuestra capa de Data Mapper:

1234567891011121314151617181920212223242526272829303132333435363738public interface IDataMapper where TObject : class{void Insert(TObject obj);void Update(TObject obj);void Delete(TObject obj);IEnumerable GetAll();}public class UserDataMapper : IDataMapper{private string connetionString;public UserDataMapper(string connetionString){this.connetionString = connetionString;}public void Insert(User user){try{using(var con = new SqlConnection(connetionString)){var sql = "INSERT INTO USER (UserId, [Name], LastName, Email) VALUES (@userId, @name, @lastName, @email)";using (var cmd = new SqlCommand(sql, con)){cmd.Parameters.Add(new SqlParameter("userId", user.UserId));cmd.Parameters.Add(new SqlParameter("name", user.Name));cmd.Parameters.Add(new SqlParameter("lastName", user.LastName));cmd.Parameters.Add(new SqlParameter("email", user.Emaild));cmd.ExecuteNonQuery();}}}catch(Exception ex){throw new DataMapperException("Error inserting a User", ex);}}public void Update(TObject obj) { /*...*/ }public void Delete(TObject obj) { /*...*/ }public IEnumerable GetAll() { /*...*/ }}

Un objeto Data Mapper es un tipo de implementacin de DAO (Data Access Object). La peculiaridad es que hace uso de un patrn Metadata Mapper. La idea es aadir una especie de diccionario (o Hashtable) que contenga las equivalencias entre los objetos de c# y las tablas de SQL Server. Pero esto quiz sea otra historia

RepositoryUna vez hemos montado nuestra capa de Data Mapper, al ir construyendo el resto de la aplicacin, nos vamos dando cuenta de que necesitamos crear un mtodo que acepte condiciones y filtros para realizar un gran nmero de consultas diferentes. Por ejemplo, necesitamos listados de usuarios paginados, listados de usuarios para mostrar en un control de tipo ComboBox, e incluso los usuarios que su nombre sea Pepe. Entonces, como resultado de este requerimiento tan genrico, tendramos una funcin parecida a esta:

123456public interface IDataMapper where TObject : class{/* ... */IEnumerable GetFiltered(string conditions, string order, int pageSize, int pageIndex);}

As tendramos la libertad de llamar a nuestro objeto UserDataMapper de formas diferentes:123456var userDataMapper = new UserDataMapper(conStr);// seleccionar los usuarios de nombre 'Pepe', ordenados por el apellido, paginando de 10 en 10, y quiero la primera pginauserDataMapper.GetFiltered("Name = 'Pepe'", "LastName", 10, 1);// seleccionar los usuarios de apellido 'Perez',sin orden, con el tamao de pgina ms grande que pueda, dame la pginauserDataMapper.GetFiltered("LastName = 'Perez' AND Email LIKE '%@mail.com'", "", int.MaxValue, 1);

Pero el lenguaje de nuestro almacn de informacin (SQL), no debera ser manejado desde la capa que gestiona el negocio de la aplicacin.Es entonces cuando quiz nos vendra bien implementar otra capa nueva de abstraccin por encima de Data Mapper. Una capa que nos ayude gestionar estas consultas de forma transparente, sin necesidad de acabar escribiendo cdigo SQL y manteniendo desacoplado el cdigo de negocio, de la forma de almacenar la informacin.El Repository surge como un sofisticado patrn que da solucin a este problema. Decimos sofisticado porque se podra definir como una combinacin de otros patrones.La idea es que un objeto Repository acte como una coleccin en memoria del modelo de dominio. A esta coleccin de objetos podremos aadirle o quitarle elementos y adems realizar bsquedas filtradas utilizando el patrn Specification:12345public interface IRepository : ICollectionwhere TEntity : class{IEnumerable FilterBy(ICriteria criteria);}

La primera caracterstica que puede llamarnos la atencin al definir Repository es el concepto demodelo de dominio. Esto es un trmino muy comn cuando hablamos deDDD(Domain Driven Design), y quiere decir que nuestra aplicacin tiene un modelo principal al que llamaremos dominio. Este modelo se diferencia del modelo de la base de datos en su concepcin. En lugar de pensar cmo vamos a almacenar las tablas y sus relaciones dentro de una base de datos, lo que vamos a hacer es pensar en la mejor forma de gestionar los objetos dentro del contexto de nuestro lenguaje de programacin y de la forma que mejor se adapte a las tareas de negocio.Y si estudiamos la implementacin propuesta, encontraremos varios detalles. Entre ellos que nuestro repositorio tendr que implementar ICollection, por lo que implementar funciones como Add que aade un objeto nuevo, o Remove que borra el objeto de la coleccin.Otro detalle es el objeto ICriteria que se le pasa como parmetro al mtodo FilterBy. Este objeto no es ms que la representacin del anteriormente mencionado patrn Specification.SpecificationEl patrn Specification viene a resolver un problema de crear diferentes reglas de negocio que puedan ser combinadas. Esto quiere decir que nos ayudar a crear diferentes normas que resolvern un problema concreto de formas diferentes. Pero para orientarnos ms rpido, vamos a ver un ejemplo de implementacin:

1234567891011public interface ISpecification {bool IsSatisfiedBy(object candidate);}public interface ICompositeSpecification : ISpecification {ISpecification And(ISpecification other);ISpecification Or(ISpecification other);ISpecification Not();}

Implementando de la forma correcta este patrn, el resultado que tendramos es que si tuviramos diferentes especificaciones, podramos combinarlas para conseguir algo ms concreto.Imaginemos que tenemos estas implementaciones:

1234567891011121314151617public class NameSpecification : ICompositeSpecification {public NameSpecification(string nameToCompare) { /* ... */ } public bool IsSatisfiedBy(object candidate) { /* candidate.Name == this.nameToCompare ... */ }public ISpecification And(ISpecification other) { /* ... */ } public ISpecification Or(ISpecification other) { /* ... */ } public ISpecification Not() { /* ... */ } }public class PageIndexSpecification : ICompositeSpecification {public NameSpecification(int pageIndex, int pageSize) { /* ... */ } public bool IsSatisfiedBy(object candidate) { /* candidate is un pageIndex using pageSize */ }public ISpecification And(ISpecification other) { /* ... */ } public ISpecification Or(ISpecification other) { /* ... */ } public ISpecification Not() { /* ... */ } }

Ahora podramos llamar a nuestro repositorio con un cdigo parecido a este:

12345var repository = new UserRepository();va