种子方法未调用,实体框架6

And*_*ard 12 c# entity-framework

DatabaseInitializer上课了

public class DatabaseInitializer : CreateDatabaseIfNotExists<DatabaseContext>
{
    protected override void Seed
        (
        DatabaseContext databaseContext
        )
    {
        // Seed the hash methods.
        var defaultHashMethod = new HashMethod
        {
            Description = "Default",
            CreateDate = DateTime.Now
        };

        databaseContext.HashMethod.Add(defaultHashMethod);

        databaseContext.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的DatabaseContext类中,我设置了初始化程序

public DatabaseContext() : base("DatabaseContext")
{
    InitializeDatabase();
}

private void InitializeDatabase()
{
    Database.SetInitializer(new DatabaseInitializer());
    if (!Database.Exists())
    {
        Database.Initialize(true);
    }            
}
Run Code Online (Sandbox Code Playgroud)

据我所知,只有在执行查询等操作时才会调用种子方法.我的数据库已成功创建,我正在查询表,但从不调用种子方法.

更新:

似乎问题是由于inheriting我的DatabaseContext类中的类引起的,当使用此类执行数据库操作时,不会调用种子方法.使用我的DatabaseContext课程时,一切都按预期工作

public DbSet<TestEntity> TestEntity { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Run Code Online (Sandbox Code Playgroud)

jum*_*uro 15

你需要打电话Update-DatabasePackage Manager Console.

  • 问题是当你这样做时,种子方法有时不被调用. (8认同)
  • 对于 CI,我们通常不想从控制台运行 `Update-Database`。许多人更喜欢通过 Web/App.config 设置自动执行此操作。通过这种方式,该过程是自动化的,您可以在运行 PR 的测试之前轻松地将新 PR 中的更改迁移到数据库。否则,当构建失败时,它会违背 CI 的目的,需要开发人员自己运行 `update-databse`... (5认同)

And*_*ard 8

我能让它工作的唯一方法就是自己调用种子方法

以下是我的DatabaseContext类的方法

 public DatabaseContext() : base("DatabaseContext")
 {
    InitializeDatabase();
 }

 public DatabaseContext(string connectionString) : base(connectionString)
 {
     Database.Connection.ConnectionString = connectionString;
     InitializeDatabase();
 }

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
 }
Run Code Online (Sandbox Code Playgroud)

在这里,我更改了我的InitializeDatabase方法

private void InitializeDatabase()
{
    Database.SetInitializer(new DatabaseInitializer());
    if (!Database.Exists())
    {
        Database.Initialize(true);
    }            
}
Run Code Online (Sandbox Code Playgroud)

protected virtual void InitializeDatabase()
{
    if (!Database.Exists())
    {
        Database.Initialize(true);
        new DatabaseInitializer().Seed(this);
    }            
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@ user65439.如果修复它会很好,但`Seed()`方法是`protected`!因为它是一个覆盖,你不能将访问者改为"public".并且因为它不是公共的,你不能从`DatabaseContext`类中调用`DatabaseInitializer`中的那个方法,就像你的代码示例所示(我得到一个编译错误).我不明白,我错过了什么? (9认同)

2b7*_*3e5 5

如果您的 Update-Database 命令未成功运行,则可能会发生这种情况,但这并不一定意味着它出错了。可能存在 EF 认为“未完成”的更改需要添加到迁移中。

尝试调用“Add-Migration {migrationNameHere}”,然后再次尝试“Update-Database”。