14

我的Seed()方法永远不会被调用。当我Update-Database从包管理器控制台执行操作时会调用它,但从代码运行时不会调用它。如果我删除我的数据库,则会创建所有表(因此我的迁移类被执行),但我的 Seed() 代码永远不会被调用。MVC 4,实体框架 5 代码优先。

全球.asax:

protected void Application_Start()
{
  Database.SetInitializer<MyContext>(new DbInitializer());
}

数据库初始化:

internal class DbInitializer : MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration>
{
}

数据库上下文:

public partial class MyContext : DbContext
{
  public MyContext() : base("DefaultConnection")
  {
  }
  // public DBSets....
}

配置:

internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
public Configuration()
{
  // The constructor is actually called
  AutomaticMigrationsEnabled = false;
}

protected override void Seed(MyContext context)
{
   // My seed code, never called
}

有什么问题?

4

3 回答 3

16

所以原因是我需要在配置文件中指定我的自定义初始化器:

  <entityFramework>
      <contexts>
        <context type="EFTest2.MyContext, EFTest2">
          <databaseInitializer type="EFTest2.Initializers.DbInitializer, EFTest2" />
        </context>
      </contexts>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>

之后,我的Seed方法被调用。

于 2013-02-03T15:22:17.513 回答
6

请首先参考接受的答案。
我只想为这个问题添加一个非常重要的说明。

我面临着这个问题所描述的完全相同的问题(这导致我来到这里)。但是我使用的是CreateDatabaseIfNotExists而不是MigrateDatabaseToLatestVersion并且即使在应用接受的答案后我的种子方法也没有执行。

我的问题如下:根据种子方法的文档:如果数据库初始化程序是以下之一,则不会执行该Seed方法DbMigrationsConfiguration

如果您使用其中一种类型,则应创建自己的类,该类继承自其中一种类型,然后在您自己的类中覆盖种子方法。

就我而言,添加以下类解决了这个问题。

public class CreateNotifierDatabaseIfNotExists : CreateDatabaseIfNotExists<NotifierContext>
{
    protected override void Seed(NotifierContext context)
    {
        // the code of the seeding is go here
    }
}
于 2015-11-23T07:57:35.340 回答
0

根据我的经验,当您停止尝试访问 DataContext 时,可能会发生这种情况。我们有一个在 DataContext 完成创建数据库时抛出错误的方法。我们将其注释掉以解决创建数据库的问题。

问题是,这是在初始加载时实际使用 DataContext 的唯一方法。这意味着没有执行 DbInitialization 逻辑,因为还不需要实例。

当我们添加一个问题较少的数据检索逻辑而不是注释掉的逻辑时,DbCreation 和 Seeding 逻辑正常进行。

于 2021-11-08T16:04:46.867 回答