2011-08-30 17 views
9

Estoy usando EF 4.1 y he creado un repositorio usando DBContext, etc. Cadena de conexión establecida para apuntar a una edición Dev de SQL Server 2008 R2.Entity Framework 4.1 Código Primero no crear tablas

Cuando ejecuto una aplicación de consola que llama a mi puerta de enlace, que a su vez agrega una entidad y la guarda, se lanza una excepción diciendo que no puede encontrar la tabla. Cuando miro mi db, hay una base de datos creada, pero no hay tablas creadas automáticamente, excepto EmdMetadata.

¿Echo de menos algo?

Marcos

Respuesta

8

Para ajustar la caída automática y crean que haría algo como esto ...

public class MyDbContext : DbContext 
{ 
    public IDbSet<Foo> Foos { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer(new MyDbContextInitializer()); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

public class MyDbContextInitializer : DropCreateDatabaseIfModelChanges<MyDbContext> 
{ 
    protected override void Seed(MyDbContext dbContext) 
    { 
     // seed data 

     base.Seed(dbContext); 
    } 
} 
+0

Eso se parece a lo que necesito, no pude llamarlo en la aplicación ya que tenía una capa sobre el Dbcontext en otra DLL, manteniendo dbcontext interno. – Mark

+3

Esto no solucionó mi problema, pero para aquellos que todavía están haciendo esto, OnModelCreating toma DbModelBuilder en lugar de solo ModelBuilder. No estoy seguro cuando cambió – Pieter

8

Puede crear las tablas de sí mismo - la forma más fácil es:

IObjectContextAdapter adapter = (IObjectContextAdapter)context; 
string script = adapter.ObjectContext.CreateDatabaseScript(); 
context.Database.ExecuteSqlCommand(script); 

Siendo contexto mi contexto de base de datos EF 4.1. Antes de este código dejo caer todas las tablas (desde la última vez que creé el db), y después de esto, lo inicializo con datos.

+0

¿De verdad? Estaba siguiendo algunos tutoriales de blog y parecían tener el suyo generado automáticamente cuando llamaron a guardar. – Mark

+0

Solo lo he usado durante un mes, y esta era la única forma en que podía descartar, reconstruir y sembrar mi base de datos. Quizás me rendí demasiado fácilmente. – iandotkelly

+0

He consultado un par de tutoriales (encontrados en google), uno de ellos incluía ejemplos de scripts de creación de SQL, uno como dices crea la base de datos automáticamente. Al igual que usted, descubrí que esto no funcionaba para la estructura db que creé, que incluía cierta integridad referencial y eliminaciones en cascada. – iandotkelly

-1

es necesario agregar esto a su Application_Start()

Database.SetInitializer(new MyDbContextContextInitializer()); 
var context = new MyDbContextContext(); 
context.Database.Initialize(true); 

La última línea de fuerza a la DB a creado

1

Mejor: añadir el inicializador al constructor estático, como esto:

public class MyDbContext : DbContext 
{ 
    static MyDbContext() 
    { 
     Database.SetInitializer(new MyDbContextContextInitializer()); 
    } 
} 
Cuestiones relacionadas