asp.net-mvc - 使用 EF5 代码优先迁移将种子数据放置在何处

标签 asp.net-mvc ef-code-first entity-framework-5

我从 EF 和 MVC 开始,并且遵循不同的教程提供了关于在数据库中放置虚拟测试数据的正确位置的不同令人困惑的想法。

所以我制作了一些 POCO 类,我有一个 BlahContext

public class BlahContext : DbContext
{
    public DbSet<Blah> Blahs { get; set; }

    public BlahContext() : base("DefaultConnection")
    {
        Configuration.ProxyCreationEnabled = false;
    }
}

然后在 Global.asax.cs 中我像这样初始化数据库:

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseAlways<BlahContext>());
}

现在我在包管理器控制台中执行了以下操作:

PM>  enable-migrations -contexttypename Blah.Models.BlahContext
PM>  add-migration Initial
PM>  update-database

这创建了 Configuration.cs,并且在该类中有一个 Seed() 方法 - 生成的注释暗示这是放置种子数据的正确位置。所以我这样填写:

internal sealed class Configuration : DbMigrationsConfiguration<Blah.Models.BlahContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(Blah.Models.BlahContext context)
    {
#if DEBUG
        context.Blahs.AddOrUpdate(b => b.ID,
            new Blah() { ID = 1, Name = "bum", },
            new Blah() { ID = 2, Name = "moo", }
        );
#endif
    }
}

现在,当我再次运行 update-database 时,它会用 2 条记录“bum”和“moo”填充 Blah 表。一切都好。

但是当我运行应用程序时,Application_Start 中的 Database.SetInitializer() 调用似乎导致重新创建数据库,但这一次 Configuration .Seed() 方法被调用。因此数据不再存在。

我看到了一些其他创建类的教程,例如:

class BlahContextInitializer : DropCreateDatabaseAlways<BlahContext>

然后 Application_Start 看起来像:

protected void Application_Start()
{
    Database.SetInitializer(new BlahContextInitializer());
}

然后在 BlahContextInitializer.Seed() 方法中包含虚拟数据。该策略仅适用于 EF4.1 吗?

我应该将种子数据放在 EF5 中的什么位置,以便在应用程序启动时它不会被清除?

最佳答案

But when I run the application, it seems the Database.SetInitializer() call in Application_Start causes the database to be recreated, but this time the Configuration.Seed() method is not called. So the data is no longer present.

如果您使用迁移,则应使用 MigrateDatabaseToLatestVersion 初始值设定项。
或者一起跳过初始化程序 - 如果您计划手动迁移 Db(使用 Update-Database)。

问题是您有两个不同的初始化程序(或者准确地说是初始化场景)尝试一起工作。那有完全不同的“计划”。这是任何其他的问题,但尤其是 DropCreateDatabaseAlways 并且无法工作

请记住 Migration Seed runs with each start of the application ,所以它有点不同(与“典型”种子相比)。


如果您有一些复杂的场景(确实需要您的初始化程序有一个典型的“种子”(就像之前所做的那样)-那么请参阅我的这篇文章,了解如何创建这样的自定义初始化程序...

What is the correct use of IDatabaseInitializer in EF?

How to create initializer to create and migrate mysql database?

关于asp.net-mvc - 使用 EF5 代码优先迁移将种子数据放置在何处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16553659/

相关文章:

c# - DDD 与 EF Code First - 如何将它们放在一起?

visual-studio - LocalDb 用于使用部署到 AppHarbor 的 Entity Framework 5.0 进行单元测试

asp.net-mvc - 如何在MVC4中隐藏URL参数

entity-framework-4 - Entity Framework 4.1 代码优先 : Single column foreign-key to multiple entities

asp.net - 如何在 ASP.NET MVC 中呈现事件报表 WebViewer

c# - EF Code First 如何为派生类创建单独的表?

entity-framework - 身份规范设置为false

c# - Linq 设置内部属性的最佳方式

asp.net-mvc - asp.net mvc - 完全脱离 DB 中的自定义字段构建 View

c# - 我在哪里可以获得有关使用 MVC/ASP.NET 开始 C# 编程的一些信息?