实体框架:构建初始数据库时只有种子

dhr*_*hrm 8 c# entity-framework entity-framework-6

我使用实体框架6DbMigrationsConfiguration:

public sealed class Configuration : DbMigrationsConfiguration<DataContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(Danfoss.EnergyEfficiency.Data.DataContext context)
    {
        //Adding initial data to context

        context.SaveChanges();
    }

}
Run Code Online (Sandbox Code Playgroud)

我以这种方式在WebAPI中使用它:

public static void Register(HttpConfiguration config)
{
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, Configuration>());
}
Run Code Online (Sandbox Code Playgroud)

我注意到Seed每次我的应用程序启动时该功能都在运行.我怎么能阻止这个?我只喜欢它在第一次运行时运行,当它构建初始表时.

Col*_*lin 4

DbMigrationsConfiguration.Seed每次调用时都会调用该方法Update-DatabaseOne Unicorn在这篇博客中解释了其背后的原因。

这意味着您必须编写Seed代码来处理现有数据。如果您不喜欢这样,您可以在CodePlex上投票支持更改。

同时,引用该博客:

处理此问题的最佳方法通常是不要对每个实体使用 AddOrUpdate,而是使用任何适当的机制更有意识地检查数据库中的现有数据。例如,Seed 可能会检查是否存在一个代表性实体,然后根据该结果进行分支以更新所有内容或插入所有内容

我过去使用过的另一个选项是使用命令在迁移本身中添加与迁移相关的常备数据Sql。这样它只运行一次。我倾向于远离这个,因为我更喜欢将种子保留在一个地方。