我正在使用EF 4.1并使用DBContext等创建了一个存储库。将连接字符串设置为指向SQL Server 2008 R2开发版。实体框架4.1代码首先不创建表
当我运行一个控制台应用程序调用我的网关,然后又添加一个实体并保存时,会抛出一个异常,说它无法找到表。当我查看我的数据库时,创建了一个数据库,但没有自动创建除EmdMetadata之外的表格。
我错过了什么吗?
马克
我正在使用EF 4.1并使用DBContext等创建了一个存储库。将连接字符串设置为指向SQL Server 2008 R2开发版。实体框架4.1代码首先不创建表
当我运行一个控制台应用程序调用我的网关,然后又添加一个实体并保存时,会抛出一个异常,说它无法找到表。当我查看我的数据库时,创建了一个数据库,但没有自动创建除EmdMetadata之外的表格。
我错过了什么吗?
马克
设置自动删除并创建你会做这样的事情...
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);
}
}
您可以自己创建表 - 最简单的方法是:
IObjectContextAdapter adapter = (IObjectContextAdapter)context;
string script = adapter.ObjectContext.CreateDatabaseScript();
context.Database.ExecuteSqlCommand(script);
其中上下文是我的EF 4.1数据库环境。在此代码之前,我删除所有表(从上次创建数据库开始),并在此之后使用数据对其进行种子处理。
真的吗?我正在关注一些博客教程,他们似乎在他们称为“保存”时自动生成了它们。 – Mark
我只用了一个月,这是我能够可靠地删除,重建和播种我的数据库的唯一方法。也许我太容易放弃了。 – iandotkelly
我看了几个教程(在谷歌上找到) - 一个包含一些示例SQL创建脚本,一个像你说的那样自动创建数据库。和你一样,我发现这对我创建的数据库结构不起作用,其中包括一些参照完整性和级联删除。 – iandotkelly
您需要添加到您的Application_Start()
Database.SetInitializer(new MyDbContextContextInitializer());
var context = new MyDbContextContext();
context.Database.Initialize(true);
最后一行强制DB创建
更好:将初始化程序添加到静态构造函数中,如下所示:
public class MyDbContext : DbContext
{
static MyDbContext()
{
Database.SetInitializer(new MyDbContextContextInitializer());
}
}
看起来像我需要的东西,我不能在应用程序中调用它,因为我在另一个dll中的Dbcontext上有一层,保持dbcontext内部。 – Mark
这并没有解决我的问题,但对于那些仍然有这个问题的人来说,OnModelCreating需要使用DbModelBuilder而不仅仅是模型构建器。不知道什么时候改变。 – Pieter