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

时间:2015-04-23 07:11:02

标签: c# entity-framework entity-framework-6

我正在使用 Entity Framework 6 与此DbMigrationsConfiguration

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();
    }

}

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

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

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

2 个答案:

答案 0 :(得分:4)

每次调用DbMigrationsConfiguration.Seed时都会调用Update-Database方法。 {/ 3}}在本博客中解释了背后的原因。

这意味着您必须编写Seed代码以应对现有数据。如果您不喜欢,可以在One Unicorn投票支持更改。

与此同时,引用博客:

  

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

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

答案 1 :(得分:0)

我遇到了同样的问题,我希望在数据库构建中创建一个初始用户。我要做的是创建一个空白迁移,然后在其中添加用户创建。由于从技术上讲,除非删除并重新应用迁移,否则迁移仅运行一次,因此可以确保迁移仅在创建数据库时运行一次。 我知道这个问题有点老了,因此它可能会对其他人有所帮助,或者您可能没有使用迁移。但是,如果您愿意,这是一种方便的技术。