2011-08-30 107 views
9

我正在使用EF 4.1并使用DBContext等创建了一个存储库。将连接字符串设置为指向SQL Server 2008 R2开发版。实体框架4.1代码首先不创建表

当我运行一个控制台应用程序调用我的网关,然后又添加一个实体并保存时,会抛出一个异常,说它无法找到表。当我查看我的数据库时,创建了一个数据库,但没有自动创建除EmdMetadata之外的表格。

我错过了什么吗?

马克

回答

8

设置自动删除并创建你会做这样的事情...

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

看起来像我需要的东西,我不能在应用程序中调用它,因为我在另一个dll中的Dbcontext上有一层,保持dbcontext内部。 – Mark

+3

这并没有解决我的问题,但对于那些仍然有这个问题的人来说,OnModelCreating需要使用DbModelBuilder而不仅仅是模型构建器。不知道什么时候改变。 – Pieter

8

您可以自己创建表 - 最简单的方法是:

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

其中上下文是我的EF 4.1数据库环境。在此代码之前,我删除所有表(从上次创建数据库开始),并在此之后使用数据对其进行种子处理。

+0

真的吗?我正在关注一些博客教程,他们似乎在他们称为“保存”时自动生成了它们。 – Mark

+0

我只用了一个月,这是我能够可靠地删除,重建和播种我的数据库的唯一方法。也许我太容易放弃了。 – iandotkelly

+0

我看了几个教程(在谷歌上找到) - 一个包含一些示例SQL创建脚本,一个像你说的那样自动创建数据库。和你一样,我发现这对我创建的数据库结构不起作用,其中包括一些参照完整性和级联删除。 – iandotkelly

-1

您需要添加到您的Application_Start()

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

最后一行强制DB创建

1

更好:将初始化程序添加到静态构造函数中,如下所示:

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