16

estoy teniendo este tipo de cuestiones "misteriosa" aquí. Actualmente uso Entity Framework 4.1 Code First approach con mi aplicación ASP.NET MVC 3, funcionó de maravilla, hasta ayer ...Entity Framework Database.SetInitializer simplemente no trabaja

Ocurrió algo realmente malo que causó que Database.SetInitializer dejara de funcionar. Explicado:

que tienen este modelo simple

public class User 
{ 
    public int Id { get; set; } 
    public int RoleId { get; set; } 

    [Required] 
    [StringLength(50)] 
    [DataType(DataType.Text)] 
    public string Login { get; set; } 

    [Required] 
    [StringLength(150)] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 

    [Required] 
    [StringLength(32)] 
    [DataType(DataType.Password)] 
    public string Password { get; set; } 

    [DataType(DataType.DateTime)] 
    public DateTime RegisteredDate { get; set; } 

    public virtual Role Role { get; set; } 
} 

Y aquí es mi DbContext

public class MyContext : DbContext 
{ 
    public DbSet<Models.User> Users { get; set; } 
} 

también que la configuración de inicialización personalizado (para la prueba)

public class MyInitializer 
      : DropCreateDatabaseIfModelChanges<MyContext> 
{ 
} 

Ahora que ya cadena de conexión en la configuración Web.config (con el nombre mismo que MyContext)Asíen Global.asax que llamo el código simple en Application_Start método

Database.SetInitializer(new MyInitializer()); 

() Pero el problema es que Database.SetInitializer WONT crear cualquier base de datos, y lo que es peor, también ni siquiera tratar de llenar base de datos existente con mesas de contexto ... traté de depuración, pero parece que la aplicación simplemente saltar por encima de la base de datos de código de inicialización ...

he encontrado una solución, es utilizar esta línea de código

var ctx = new MyContext(); 
ctx.Database.Initialize(true); 

Así que aquí estoy forzando código para crear DB de todos modos ...

Pero el hecho de que Database.SetInitializer no funcione realmente es molesto ... funcionó muy bien antes, no sé lo que pasó. miré en eventos revista ventanas, los registros del servidor SQL ... pero no hay nada allí. Solo silencio. Pero tal vez Im simplemente buscando en el lugar equivocado? : S

Alguien puede decirme lo que está pasando?

P.S Estoy utilizando Visual Web Developer 2010 + SQL Server 2008 R2

Respuesta

42

La base de datos sólo se crea cuando se utiliza realmente el contexto.

Si ha anulado el método de la semilla en su inicializador de la siguiente manera:

protected override void Seed(MyContext context){...} 

El código de semillas sólo se ejecutará cuando se utiliza una instancia de MyContext.

Por eso funciona cuando se utiliza

var ctx = new MyContext(); 
ctx.Database.Initialize(true); 

Siempre podría obligarlo a crear mediante el uso de su contexto en el método Application Start() en Global.asax.cs como:

 System.Data.Entity.Database.SetInitializer(new MyInitializer()); 

     MyContext db = new MyContext(); 
     db.Database.Initialize(true); 
     //or even something like db.Users.Count(); 

O se creará más adelante, cuando usted utiliza su contexto.Pudo haber parecido que había dejado de funcionar porque eliminó algún código que usaría el contexto en el inicio de la aplicación.

+0

Sí funciona ... Gracias. Realmente me olvidé de todas esas cosas de "carga lenta". :) – geCoder

0

Otra forma de crear una base de datos

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>()); 

var context = new MyContext(); 
context.Database.Create(); 
-1

que tenía el mismo problema con mi código primeras definiciones y reducido a DBInitializer múltiple se define en un archivo de clase. Así que la regla del pulgar a seguir después de comprobar la sintaxis y el uso es:

1) Tener sólo una definición inicializador en un archivo físico
2) Definir el DbContext y inicializador en archivos separados

HTH

0

en los Global.asax.cs

Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, DbMigrationConfig>()); 

donde DbMigrationConfig es la clase de configuración en la carpeta de migraciones, que retitulé. También asegúrese de habilitar las migraciones automáticas en el constructor de la configuración