【问题标题】:Entity Framework Code First Seed database实体框架代码优先种子数据库
【发布时间】:2016-02-12 00:06:05
【问题描述】:

我正在使用 E.F. 和 Code First 方法......现在我必须用一些数据填充数据库......但我不能轻易做到......事情不清楚...... 我已经用谷歌搜索了,但我发现的每个解决方案都假设我必须创建一个自定义初始化......但我不想创建一个自定义初始化......

我需要的是一种方法,每次我启动一些测试时都删除数据库,重新创建它并用一些数据填充它。

我尝试做的是:

public PublicAreaContext()
    : base("PublicAreaContext")
{
    Database.SetInitializer<PublicAreaContext>(new DropCreateDatabaseAlways<PublicAreaContext>());
}

然后我尝试在Configuration 类中实现Seed 方法。所以:

internal sealed class Configuration : DbMigrationsConfiguration<PublicAreaContext>
{
    protected override void Seed(PublicAreaContext context)
    {
        ...
    }
}

但是当我尝试调试时,我从不进入种子方法......我进入 Configuration 类的构造函数,但没有进入种子......为什么?

感谢您的帮助

【问题讨论】:

  • Seed 方法将在您创建迁移并基于该迁移更新数据库时运行。您是否正在创建新的迁移?
  • 不,我没有创建任何迁移...我只想在每次启动测试套件时删除数据库,重新创建然后填充一些数据...

标签: entity-framework-6


【解决方案1】:

您混淆了种子方法。创建数据库时可以使用一个初始化器,还有一个用于迁移。见http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

由于您使用的是 DropCreateDatabaseAlways,因此无法运行迁移,因此请执行以下操作:

public static class MyDatabase
{
    public static void Initialize()
    {
        Database.SetInitializer(new MyInitializer());
    }
}

public class MyInitializer : DropCreateDatabaseAlways<PublicAreaContext>
{
    protected override void Seed(PublicAreaContext context)
    {
        base.Seed(context);
        context.Roles.Add(new Role
        {
            ID = 1,
            Name = "User",
        });
        context.Roles.Add(new Role
        {
            ID = 2,
            Name = "Admin",
        });
        context.SaveChanges();
    }
}

其他示例: http://www.codeguru.com/csharp/article.php/c19999/Understanding-Database-Initializers-in-Entity-Framework-Code-First.htm

http://www.techbubbles.com/aspnet/seeding-a-database-in-entity-framework/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2012-03-15
    相关资源
    最近更新 更多