实体框架代码优先:Configuration.cs seed或自定义初始化器

本文关键字:seed 自定义 初始化 cs Configuration 代码 框架 实体 | 更新日期: 2023-09-27 17:49:18

我第一次使用实体框架的代码优先风格。我想设置一些默认数据。我遇到的第一种方法是创建自定义初始化器。我本来打算走这条路,但在设置迁移后注意到,它附带了Configuration.cs,它已经像自定义初始化器一样覆盖了seed方法。

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" }
        //    );
        //
    }
}

所以似乎有两种方法来完成这个任务。有人能告诉我推荐的做法是什么吗?或者这有什么关系,我应该抛硬币决定?

实体框架代码优先:Configuration.cs seed或自定义初始化器

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

另一方面,可以设置自定义初始化器的seed方法,使其在每次加载应用程序时都运行,就像下面的代码一样,它当前位于Global中。我的MVC页面的ax文件:

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

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