为什么在我的EF代码首次迁移方案中再次调用Seed方法?

时间:2016-06-30 14:21:56

标签: ef-code-first ef-migrations

我有一个EF代码第一个项目,我有如何种子数据库

internal sealed class Configuration : DbMigrationsConfiguration<myDB>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "myDB.Auth.Service.DAL.myDB";
        }

        protected override void Seed(myDBdb)
        {
           var mProduct = new Product
             {
                Name = "default product",
               CreatedDate = DateTime.Now
            };

           db.Products.AddOrUpdate(mProduct);
           db.SaveChanges();
        }
}

我有一个使用上面代码的wcf服务。我意识到每次重新启动wcf服务时(无论是从visual studio还是IIS),都会调用上面的代码。结果,多个&#34;默认产品&#34;被添加到数据库中,任何人都知道为什么会发生这种情况?

4 个答案:

答案 0 :(得分:1)

第一步是使用Tools菜单,选择Library Package Manager,然后选择Package Manager Console。在Package Manager Console窗口中,键入以下命令。

  Enable-Migrations

将在项目中添加名为Migrations的文件夹,以及名为Configuration.cs的代码文件。

在Configuration.cs中

键入以下行

使用yourprojectname.Models;

protected override void Seed(yourprojectname.Models.MyServiceContext context)
{
   context.MyDB.AddOrUpdate(x => x.Id,
    new MyData() {  Name = "Mohit",   CreatedDate= "14/05/2016" },
    new MyData() {  Name = "Prabhat", CreatedDate= "15/05/2016" },

    );  
 }

现在输入Update-Database
   在包管理器控制台窗口中

答案 1 :(得分:0)

尝试以下方法:

protected override void Seed(myDBdb)
{
    var mProduct = new Product
    {
        Id = 1,
        Name = "default product",
        CreatedDate = DateTime.Now
    };

    db.Products.AddOrUpdate(mProduct);
    db.SaveChanges();
}

答案 2 :(得分:0)

首次使用应用程序初始化数据时,请使用ThreadLocal。例如:

DropCreateDatabaseAlways

答案 3 :(得分:0)

迁移种子在每个更新数据库之后运行,因此您需要通过测试存在或使用AddOrUpdate使您的脚本具有幂等性。如果您只想在数据库创建上播种,则会有一个单独的上下文种子方法,该方法仅在创建数据库时运行。

https://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

AddOrUpdate for seeding

编辑:

使用MigrateDatabaseToLatestVersion初始化程序时,每次运行应用程序时都会运行种子方法。如果要控制此过程,请将初始化程序切换为null:

Database.SetInitializer(new NullDatabaseInitializer<ApplicationDbContext>());

然后只需在需要时手动运行迁移。为了更进一步,您可以编写自己的初始化程序,并在数据库不存在或数据库需要更新时执行您想要的操作:

Database.SetInitializer(new ValidateDbInitializer<ApplicationDbContext>());

// ref: https://coding.abel.nu/2012/03/prevent-ef-migrations-from-creating-or-changing-the-database/
public class ValidateDbInitializer<TContext> : IDatabaseInitializer<TContext>
    where TContext : ApplicationDbContext
{
    public void InitializeDatabase(TContext context)
    {
        if (!context.Database.Exists())
        {
            throw new InvalidOperationException("The database does not exist. Check your server and connection string.");
        }
        if (!context.Database.CompatibleWithModel(true))
        {
            throw new InvalidOperationException("The database is not up to date. You may need to apply update(s).");
        }
    }
}