[How To][Code First] Definir la base de datos del proyecto.

Hola, por defecto cuando trabajamos con CodeFirst este usa .\ SQLEXPRESS para hospedar la base de datos, y la creara con el nombre definido en nuestra clase de contexto. Pero si deseamos cambiar este comportamiento ¿que debemos hacer? bien, en este post enseñare como usar aun base de datos Existente, como crear una nueva y como usar dos Bases de datos en “simultaneo”.

Dadas las entidades:

    public class Pais
    {
        public int Id { get; set; }
        public string Nombre { get; set; }
    }

    public class Ciudad
    {
        public int Id { get; set; }
        public int PaisId { get; set; }
        public virtual ICollection Pais { get; set; }
        public string Nombre { get; set; }
    }

Y dado el contexto:

    public class DemosCodeFirstEntities : DbContext
    {
        public DbSet Pais { get; set; }

        public DbSet Ciudad { get; set; }
    }

– Como usar una base de datos existente.

Para emplear una base de datos existente, nos bastara con entender la convención de connectionstring, que nos dice que se empleara la cadena de conexión que use el mismo nombre del contexto. Entonces podemos emplear una connectionstring de la forma:

  
    connectionString="Data Source=.;Initial Catalog=EFDemo;Persist Security Info=True;User ID=sa;Password=*****"
         providerName="System.Data.SqlClient" />

Si ejecutamos el siguente codigo:

            using (var context = new Contexto.DemosCodeFirstEntities())
            {
                context.Pais.Add(new Pais { Nombre = "Argelia" });
                context.SaveChanges();
            }

Veremos que CodeFirst ha empleado la base de datos que le hemos indicado en el ConnectionString, solo por haber usado la convención de cadena de conexión.

– Como crear una nueva base de datos.

Para crear una nueva base de datos, basta con reusar la cadena de conexión del ejemplo anterior, pero en lugar de definir un catalogo existente, vamos a emplear un catalogo nuevo, así:

  <connectionStrings>
    <add name="DemosCodeFirstEntities"
         connectionString="Data Source=.;Initial Catalog=CreadoNuevo;Persist Security Info=True;User ID=sa;Password=****"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

Al ejecutar y usar el contexto si revisamos, veremos que se ha creado un nuevo catalogo con las tablas que hemos definido y una adicional, la EdmMetadata este es empleado por EF para saber que el modelo fue mapeado correctamente y es compatible con la base de datos. Si modificáramos entonces el modelo agregando una tabla, obtendríamos una excepción y deberíamos eliminar y crear nuevamente la base de datos. Sobre como evitar este comportamiento, lo veremos en un post siguiente.

– Como usar dos bases de datos.

Para poder emplear dos bases de datos, una para test y otra para producción por ejemplo, debemos usar dos connectionstring con distinto nombre y agregar un constructor al contexto que nos permita usarlo,  así:

App.Config:

    DemosCodeFirstEntitiesTest"
           connectionString="Data Source=.;Initial Catalog=BaseTest;Persist Security Info=True;User ID=sa;Password=****"
           providerName="System.Data.SqlClient" />

El Conetxto:

    public class DemosCodeFirstEntities : DbContext
    {
        public DemosCodeFirstEntities(string connectionString)
            : base(connectionString)
        {

        }

        public DbSet Pais { get; set; }

        public DbSet Ciudad { get; set; }
    }

Si compilamos obtendremos un error, esto se debe a que este comportamiento no pertenece al ensamblado EntityFramework, debemos agregar una referencia a System.Data.Entity. Y del lado de quien lo consume, pasamos el nombre de la cadena de conexión que deseamos usar:

            using (var context = new Contexto.DemosCodeFirstEntities("DemosCodeFirstEntitiesTest"))
            {
                context.Pais.Add(new Pais { Nombre = "Italia" });
                context.SaveChanges();
            }

Como ven entendiendo y usando las convenciones que maneja code first podemos trabajar de manera muy flexible.

Espero les sea de utilidad.

Hasta el próximo post.

Anuncios
[How To][Code First] Definir la base de datos del proyecto.

2 comentarios en “[How To][Code First] Definir la base de datos del proyecto.

  1. Hola, no sabia de tu post y me mande a escribir uno que dice basicamente lo mismo :(, ahora bien el tuyo es muy bueno y esta muy claro, solo me gustaria aportar que es bueno ponerle a la cadena de conexión el atributo MultipleActiveResultSets=True, para evitar unos problemas de multiples consultas sobre un mismo contexto, te dejo el link de lo que escribi que tiene algo de informacion de documentacion y un ejemplo de este problema con la cadena de conexion sin el atributo.

    http://msexpertos.com/2012/04/20/ef-cadenas-de-conexion/

    Saludos y felicitaciones.

    1. Hola Juan.

      Antes que nada gracias por el comentario, vale pues esto de los MARS hasta donde yo he tenido la oportunidad de trabajar con EF ya no van 🙂 ¿por que? porque si usas contextos de vida corta veras que estos abren y sueltan la conexion de una sola vez, y si mandas tus consultas de L2E veras traducidas todas tus consultas de SQL una tras otra para esa sesion… incluso con el LazyLoad Activo veras como va de bien, Me gustaria que me mandaras las instrcucciones de como generar el problema que cometas, para trabajarle y revisarlo más a fondo.

      Ahora bien, revisando tu WebSite veo que eres escalador en roca 😀 Enhorabuena!! yo tambien, entrenaba seguido en Suesca Cund. y en la Calera Cund….. Podriamos entrenar y discutir al respecto, ya debo estar tronco pues llevo ya casi un año sin practicar 😦 jajaja, me comentas por interno 😀

      Quedo atento a tus comentarios.

      Saludos.

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