Pequeños detalles sobre Entity Framework (1ª parte)

23. July 2011 00:37 by Oscar.SS in Desarrollo Empresarial  //  Tags:   //   Comments (0)

En esta serie de artículos vamos a ver algunos compartamientos que hay que tener en cuenta a la hora de trabajar con Entity Framework. En su mayoría son elementos muy sencillos que la mayoría ya conoceréis, pero tampoco está de más recordarlo.

Para los ejemplos vamos a utilizar una pequeña base de datos, creada para la ocasión, que simula de manera muy simplificada la gestión de venta de libros en una tienda o librería. Este sería nuestro modelo Entity Framework con el que vamos a trabjar.

 

 

El contexto trabaja desconectado

Una de las primera cosas que hay que tener en cuenta cuando trabajamos con una instacia de nuestro modelo de Entity Framework, es que principalmente trabaja desconectado de la base de datos. Es decir, en realidad es una representación en memoria del esquema de tablas de nuestra base de datos. En este sentido recuerda un poco a los DataSet.

Por lo tanto cuando escribimos el código siguiente:

            //Instanciamos el contexto de datos
            
var dataContex = new BooksDBModelContainer();

            
//Creamos un cliente
            
var miCliente = new Cliente
                              {
                                  Nombre 
"Antonio Sánchez",
                                  Direccion 
"Santo Dominto 5",
                                  Telefono 
"999999999"
                              
};

            
//Añadimos el cliente al contexto
            
dataContex.Clientes.AddObject(miCliente);

 Hemos creado un Cliente y lo hemos añadido al contexto, o lo que es lo mismo, lo hemos añadido en memoria. Pero aún no se ha abierto una conexión con la base de datos y tampoco se ha insertado un registro en nuestra tabla Clientes. Sin embargo cuando ejecutamos la siguiente instrucción:


            //Conexión a base de datos e insercción en la tabla Clientes
            
dataContex.SaveChanges();

Esto es importante tenerlo en cuenta si por ejemplo queremos añadir varias entidades seguidas, como en un bucle. Solo al salir de este debemos ejecutar la linea enterior. De lo contrario estaríamos abriendo y cerrando conexiones con la base de datos en cada paso del bucle, con la consecuente penalización de rendimiento.

 

Sincronización automática de identificadores

Al ejecutar el método SaveChanges(), como acabamos de ver, se abre una conexión con base de datos y se realiza la inserción de nuestro Cliente. Pero también ocurren otras cosas, digamos, en el otro sentido.

Si inmediatamente después de ejecutar la linea anterior intentamos en nuestro código acceder al ID de nuestro Cliente nos daremos cuenta que este tiene el valor que se ha generado la base de datos.

 

 

Por lo tanto cuando se ejecuta el método SaveChanges() no solo se produce un volcado hacia la base de datos, también se produce una actualización o sincronización hacia nuestras entidades en memoria de todos aquellos campos auto generados en la base de datos.

 

Detección automática de cambios en el contexto

Para explicar este comportamiento vamos ahora a insertar un Ejemplar en nuestra base de datos. Pero como un ejemplar tiene que estar ligado a un Cliente (que lo compra) y a un Libro en concreto, antes debemos insertar estas entidades.

            var dataContex = new BooksDBModelContainer();

            
//Añadimos un cliente
            
var maria = new Cliente
                              {
                                  Nombre 
"María Fernadez",
                                  Direccion 
"Castellana 223",
                                  Telefono 
"444444444"
                              
};

            
dataContex.Clientes.AddObject(maria);
            
            
//Añadimos un libro
            
var arteDefensa = new Libro
                                  {
                                      Titulo 
"El arte de la defensa en Ajedrez",
                                      Isbn 
"84-8019-878-8",
                                      Editorial 
"Paidrotibo"
                                  
};

            
dataContex.Libros.AddObject(arteDefensa);

            
//Insertamos el cliente y el libro en la base de datos
            
dataContex.SaveChanges();

            
//Añadimos un ejemplar
            
var unEjemplar = new Ejemplar
                                 {
                                     Precio 
24,
                                     Encuadernacion 
"Blanda",
                                     Edicion 
"Bolsillo",
                                     ClienteId 
maria.ClienteId,
                                     LibroId 
arteDefensa.LibroId
                                 }
;

            
dataContex.Ejemplares.AddObject(unEjemplar);
            
dataContex.SaveChanges();

Como se puede apreciar en el código para insertar el Ejemplar y ligarlo a las entidades Cliente y Libro hemos establecido sus propiedades ClienteId y LibroId haciendo uso de la sincronización que comentabamos en el punto anterior. Pero también podemos codificarlo de otra forma.

            //Añadimos un ejemplar
            
var unEjemplar = new Ejemplar
                                 {
                                     Precio 
24,
                                     Encuadernacion 
"Blanda",
                                     Edicion 
"Bolsillo",
                                     Cliente 
maria,
                                     Libro 
arteDefensa
                                 }
;

            
dataContex.SaveChanges();

Fijaros en la diferencia. En lugar de utilizar las propiedades ClienteId y LibroId del Ejemplar, hemos establecido las propiedades de navegación Cliente y Libro con las respectivas referencias a los objetos "maria" y "arteDefensa".

Pero hay una diferencia más importante. Al codificarlo de esta forma no hemos tenido que añadir al contexto la entidad Ejemplar antes de ejecutar el método SaveChanges(). Entity Framework detecta que se ha producido un cambio en el contexto actual y lo añade por nosotros. O lo que es lo mismo, detecta que las entidades Cliente y Libro se han ligado al Ejemplar, lo que representa un cambio en el contexto y actualiza este por nosotros.

 

En el siguiente artículo veremos como se comporta el contexto EF cuando viaje entre las diferentes capas de una aplicación.

Recent Comments

Comment RSS

Month List