如果模型更改,如何在EF中重新创建数据库?

时间:2012-01-09 18:19:12

标签: c# .net entity-framework

我创建了一个像这样的DbContext:

   public class myDB : DbContext
   {
     public DbSet<Party> Parties { get; set; }
     public DbSet<Booking> Bookings { get; set; }
   }

这生成了我的DataBase和上面的两个表.Great

然后我决定在混音和放大器中添加另一个DbSet。我收到了一个错误:

  

支持'Party'上下文的模型自创建数据库以来已发生变化

我知道使用modelbuilder.IncludeMetadataInDatabase = false;Database.SetInitializer<ClubmansGuideDB>(null);

对此进行了修复

1)将新类添加到上下文并在DataBase中生成它们的正确方法是什么?

2)在我自己试图解决这个问题的过程中,我删除了表并尝试重新运行应用程序但没有成功,然后我删除了完整的数据库并重新运行,它不会重新生成数据库。我怎样才能从头开始 - 某处有缓存吗?

3 个答案:

答案 0 :(得分:15)

我相信你在寻找:

Database.SetInitializer<ClubmansGuideDB>(new DropCreateDatabaseIfModelChanges<ClubmansGuideDB>());

自EF 4.1及以上版本起。

请注意,这假设您有权删除数据库。我在本地这样做是为了便于开发,但在暂存/生产中禁用它(我做一个手动架构比较并推送我的更改)。

顺便说一下,为了测试,如果你需要强制重新创建数据库,你可以这样做:

using (var context = new ClubmansGuideDB()) {
    context.Database.Initialize(force: true);
}

using如果您还没有对数据库的引用)

答案 1 :(得分:3)

您可以让实体框架使用Database Initializer重新创建整个数据库,或者如果您想迁移数据,可以查看Code First Migrations

以下内容将在模型更改时重新创建数据库:

Database.SetInitializer<myDB>(new DropCreateDatabaseIfModelChanges<myDB>());

答案 2 :(得分:0)

尝试将它放在Global.asax.cs Application_Start()方法中。

Database.SetInitializer<DatabaseContext>(null);

要在app run上从头开始重置数据库,请创建一个类似

的类
//Where myDB is your context
public class EntityBase: DropCreateDatabaseAlways<myDB>
{

} 

然后在你的Application_Start()方法中你可以这样做

Database.SetInitializer(new EntityBase());