实体框架代码优先:Configuration.cs种子或自定义初始化程序

时间:2012-12-20 20:56:12

标签: c# entity-framework ef-code-first

我第一次使用实体框架的Code First风格。我想设置一些默认数据。我遇到的第一种方法涉及创建custom initializer。我在这条路线上走了一段路,但是在设置迁移之后注意到它随附的Configuration.cs已经覆盖了种子方法,就像自定义初始化器一样。

internal sealed class Configuration : DbMigrationsConfiguration<Toolkit.Model.ToolkitContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(Toolkit.Model.ToolkitContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

所以似乎有两种方法可以完成这项任务。有人可以了解一下推荐的做法吗?或者它是否重要,我应该翻转硬币?

1 个答案:

答案 0 :(得分:13)

Configuration.cs Seed方法将在每次模型更改时运行,以确保某些特定数据保留在您的数据库中,或者甚至可能将该数据重置为指定的默认设置。

另一方面,自定义初始化程序的种子方法可以设置为每次加载应用程序时运行,就像此代码中一样,该代码当前位于我的MVC页面的Global.asax文件中:

Database.SetInitializer(new MyCustomInitializer<MyDbContext, Configuration>());
var db = new MyDbContext();
db.Database.Initialize(true);

部署应用程序后,实际差异真正发挥作用。自定义初始化程序将确保没有用户可以销毁程序中绝对需要的某些数据。