ASP.NET Entity Framework Code First Migrarion

问题描述:

这是一个带有Entity Framework 6.1 Code First应用程序的ASP.NET MVC。ASP.NET Entity Framework Code First Migrarion

我需要我的应用程序来创建数据库,如果它不存在和种子的表与一些数据。此外,如果使用MigrateDatabaseToLatestVersion更改模型,我需要在应用程序启动时迁移数据库。

在的Application_Start我有:

protected void Application_Start() 
{ 
    Database.SetInitializer(new MyAppDataInitializer()); 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyAppDataContext, MyApp.Model.Migrations.Configuration>()); 
} 

的初始化:

public class MyAppDataInitializer: CreateDatabaseIfNotExists<MyAppDataContext> 
{ 
    protected override void Seed(MyAppDataContext context) 
    { 
     Code to add some "CREATION DATA" 
    } 
} 

这里是迁移配置类:

public class Configuration : DbMigrationsConfiguration<MyApp.Model.DataContext.MyAppDataContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 
      AutomaticMigrationDataLossAllowed = true; 
      ContextKey = "MyApp.Model.DataContext.MyAppDataContext"; 
     } 

     protected override void Seed(MyApp.Model.DataContext.MyAppDataContext context) 
     { 
      Code to add some "MIGRATION DATA" 
     } 
    } 

当我的应用程序启动时,它如预期,除了作品有一件事:

  • 如果数据库存在,它工作的很完美,它会根据新模型更改数据库,并使用“MIGRATION DATA”为数据库播种。

  • 如果数据库不存在,它将创建数据库,但它只会使用“迁移数据”对数据库进行种子处理,但不会对“创建数据”进行种子处理。没有调用inicializer中的SEED方法。

我敢肯定有什么我做错了,但我想不通我怎么可以创建数据库时不存在,它和种子一些“初始化”的数据,它仅首次插入。

然后,当更改模型时,它只会更改数据库并添加我在迁移种子方法中设置的数据以防万一需要。

你能帮我解决吗?

在此先感谢。

您正在覆盖初始值设定项。这是一个“套”不是“添加”初始化和只能有一个..

protected void Application_Start() 
{ 
    Database.SetInitializer(new MyAppDataInitializer()); 
    // Now the initializer gets "re-set" again and MyAppDataInitializer is not used at all 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyAppDataContext, MyApp.Model.Migrations.Configuration>()); 
} 
+0

我明白了,谢谢。所以我怎么做我想要的?我可以问数据库是否存在,如果不存在,只需在创建数据库后插入创建数据?或者有像创建数据库一样的事件? – 2014-11-04 12:34:05

如果数据库中存在与否里面MyApp.Model.Migrations.Configuration类可以检查。在Seed方法首先检查数据库是否存在,如果不是则创建数据库然后是种子数据。

public class Configuration : DbMigrationsConfiguration<MyApp.Model.DataContext.MyAppDataContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = true; 
     ContextKey = "MyApp.Model.DataContext.MyAppDataContext"; 
    } 

    protected override void Seed(MyApp.Model.DataContext.MyAppDataContext context) 
    { 
     if (!context.Database.Exists()) 
      context.Database.Create(); 

     Code to add some "MIGRATION DATA" 
    } 
} 
+0

当我检查那个事件(种子)时,它总是存在。即使当时还没有创建数据库... – 2014-11-04 20:44:50

+0

发布创建数据和迁移数据的代码 – 2014-11-05 05:57:55

+0

我的代码在第一篇文章中。现在我已经删除了创建代码,因为可以只有一个......但是如果我检查该数据库是否存在于Seed方法内,它总是存在。 – 2014-11-05 07:22:09