Entity Framework: Database First

En el post anterior hablamos de las formas disponibles que tenemos de implementar Entity Framework en nuestra aplicación. Hoy vamos a ver la primera (y tal vez más sencilla) forma de implementarlo: Database First.

Database First es el método que nos permite primero crear la base de datos con sus tablas (y otras estructuras) y luego incorporarlas a la aplicación. Esto es necesario cuando la aplicación que realizamos necesita utilizar una base de datos existente. Otro uso que podemos darle es cuando necesitamos crear la base de datos, pero nos es más cómodo realizar la definición de las estructuras de la base de datos directamente con sentencias SQL, y luego importar los resultados en la aplicación (lo cual en muchos casos es muy útil y necesario, ya que nos permite definir las estructuras SQL tal cual las queremos o las necesitamos).

Lo primero que vamos a hacer es crear nuestra base de datos y sus tablas asociadas en SQL Server. Para este ejemplo vamos a crear un caso de “juguete” de una biblioteca. La misma tendrá almacenados libros, los cuales tendrán una editorial y autor, y los retiros que los usuarios hagan sobre los mismos. Las tablas generadas serán:

  • Books: almacena los libros.
  • Editorials: almacena las editoriales.
  • Authors: almacena los autores.
  • Withdraws: almacena los retiros que hacen los usuarios.
  • Users: usuarios que hacen los retiros.

Para implementarlo en nuestra aplicación es muy sencillo, lo primero que vamos a hacer es agregar el archivo de Entity Framework a nuestra aplicación. En este caso particular lo haré en un nuevo proyecto de tipo “Biblioteca de clases”, de forma que quede separada la gestión de los datos de lo que es la aplicación Web en sí (esto implica agregar una referencia desde el proyecto Web al nuevo que estamos creando).

Sobre este proyecto agregamos un nuevo elemento de tipo “ADO.NET Entity Data Model”, como se muestra en la imagen. En este caso lo nombraremos TestDataContext.

Agregar DC - Database First
Agregar nuevo DataContext

Una vez que presionemos “Agregar”, seleccionamos la opción “Generar desde la base de datos”. En un caso normal, no deberíamos tener la cadena de conexión configurada en nuestra aplicación, por lo que daremos click en “Nueva conexión…” (en caso de ya tenerla ingresada, saltear el punto a continuación):

SetearConexion - DatabaseFirst
Configurar la cadena de conexión

Como se ve en la pantalla anterior, debemos ingresar el nombre del servidor, datos de autenticación en caso de que sean necesarios y la base de datos que queremos utilizar. Una vez que presionamos “Aceptar” tendremos la confirmación de la cadena de conexión a utilizar.

El paso siguiente es seleccionar las estructuras de SQL que queremos incluir en nuestra aplicación. Para incluirlas, solo debemos seleccionar el check correspondiente.
Si trabajamos con nombres de tablas en ingles (como estamos haciendo en este ejemplo), el asistente nos ofrece la opción de poner los nombres de las clases en singular, aunque la tabla esté en plural permitiéndonos que el código resultante quede mucho más prolijo y representativo de lo que se está modelando con el mismo:

AgregarTablas - DatabaseFirst
Agregar estructuras al DataContext

Al presionar “Aceptar” se hará el mapeo de las estructuras en el DataContext. Para nuestro ejemplo el resultado es el siguiente:

ModeloDatos - DatabaseFirst
Clases en el DataContext

Una vez realizado esto ya podremos utilizar estas clases contenidas en el DataContext, como podemos ver en el siguiente ejemplo:

UsoDC - DatabaseFirst
Uso de clases DataContext

Esto nos permitirá interactuar directamente con nuestra base de datos. Una de las grandes ventajas que presenta este enfoque es la facilidad de mantenimiento que ofrece. En caso de que haya algún cambio en las estructuras, solo debemos abrir el archivo del DataContext (con extensión edmx), hacer click derecho sobre una zona sin clases y seleccionar la opción “Actualizar modelo desde base de datos…”. Allí nos aparecerá una ventana idéntica a la de que usamos cuando agregamos las estructuras en primer término, pudiendo seleccionar que clases actualizar (tanto porque sean nuevas las tablas, se hayan modificado columnas, o se haya eliminado la tabla):

ActualizarDC - DatabaseFirst
Opción para actualizar el DataContext

Estos son los pasos necesarios a seguir para implementar esta técnica. Como opinión personal, es recomendable para cualquier tipo de proyectos ya que permite definir nuestras tablas (u otras estructuras) en el motor de base de datos y luego importarlas de forma sencilla. Generalmente este es un orden lógico de trabajo cuando comenzamos una nueva aplicación.
En los proyectos pequeños no tiene desventajas, ya que no requiere mucho tiempo para implementarlo. Y en los proyectos grandes mantiene el orden, ya que distintas personas harán modificaciones simultáneas en la base de datos, las cuales cada uno importará en el DataContext cuando sea necesario.

Anuncios

14 comentarios en “Entity Framework: Database First

  1. Hola Diego! Estoy por migrar un proyecto viejo a esta tecnologia, para lo cual tengo pensado emplear un modelo de 3 capas con winforms…estuve investigando y vi que es aconsejable, una vez generado el EDM, generar y mover las clases POCO a un proyecto separado. Mi duda es, una vez realizado esto, suponiendo que modifico la BD y actualizo dicho modelo EDM para reflejar los cambios en el contexto, deberia actualizar manualmente las clases POCO que movi al proyecto aparte?? Cual es el modo que empleas vos particularmente?? Saludos!

    Me gusta

  2. Diego, gracias por todo es muy bueno, por casualidad no tienes alguna entrada que hable sobre el data context, enrealidad me interesa utilizar entity framework con procedimientos almacenados, ya que por políticas (de los años 90) de la empresa solo se puede manipular los datos a través de procedimientos almacenados y de verdad es muy confuso todo lo que e encontrado.

    De ante mano gracias!.

    Me gusta

    • Hola, muchas gracias por leer!
      Te comento que no debería haber mayores inconvenientes para el caso que me mencionas. Fijate que en la imagen de este post donde agregamos las tablas existentes en nuestra base de datos, más abajo tenemos una opción para los procedimientos almacenados. Allí deberías poder seleccionar los SP’s de tu base de datos para luego utilizarlos desde el DataContext.
      Si algo no queda del todo claro o no te funciona me avisas y lo vemos.
      Saludos!

      Me gusta

  3. HOLA MUY BUEN POST DIEGO
    YO TENGO UNA DUDA GRANDE ESPERO ME PUEDAS AYUDAR.
    COMO PUEDO AGREGAR REGISTROS A LA TABLA WITHDRAW YA QUE SE RELACIONA DE EBOOK Y EBOOK SE RELACIONA CON AUTHOR.
    MUCHAS GRACIAS SALUDOS

    Me gusta

    • Hola, muchas gracias!
      Para agregar registros a la tabla de Withdraws deberías crear una nueva instancia de la clase de datos, y manipulando el DataContext lo agregas. Sería algo similar a lo siguiente:

      var newWithdraw = new Withdraw():
      // Seteo de propiedades.
      dc.Withdraws.Add(newWithdraw);
      dc.SaveChanges();

      Lo que tenes que tener en cuenta es que como bien decís un withdraw está asociado a un book, por lo que vas a tener que recuperarlo de la base de datos primero para luego si asignarlo a la variable correspondiente, ya que sino estarías duplicando registros.

      Si algo no queda claro me avisas.
      Saludos!

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s