Метод семян не называется, Entity Framework 6

У меня есть класс 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();
    }
}

В моем классе DatabaseContext я устанавливаю инициализатор

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

private void InitializeDatabase()
{
    Database.SetInitializer(new DatabaseInitializer());
    if (!Database.Exists())
    {
        Database.Initialize(true);
    }            
}

Насколько я понимаю, метод seed вызывается только после выполнения операции, такой как запрос. Моя база данных создана успешно, и я запрашиваю таблицу, но метод семени никогда не вызывается.

Update:

Похоже, проблема вызвана тем, что класс inheriting из моего класса DatabaseContext при использовании этого класса для выполнения операций с базой данных метод seed не вызывается. При использовании моего класса DatabaseContext все работает как ожидается

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

Ответ 1

Единственный способ, которым я мог заставить это работать, - вызвать сам метод семени

Вот методы для моего класса 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>();
 }

Здесь я изменил свой метод InitializeDatabase из

private void InitializeDatabase()
{
    Database.SetInitializer(new DatabaseInitializer());
    if (!Database.Exists())
    {
        Database.Initialize(true);
    }            
}

к

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

Ответ 2

Вам нужно вызвать Update-Database из Package Manager Console.

Ответ 3

чтобы получить метод Seed, который вызывается, когда вы не, используя AutomaticMigration, вы должны использовать инициализатор MigrateDatabaseToLatestVersion для своей базы данных с кодовым именем.
например:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourContext,YourConfiguration>());  

таким образом, метод Seed будет вызываться каждый раз, когда перенос выполняется успешно.

Ответ 4

У меня была эта проблема, и проблема заключалась в том, что мой конструктор контекста не использовал то же имя, что и в моем web.config.

Ответ 5

Если вы используете Code-First, вы можете заполнить данные, когда приложение запускается в первый раз.

  • Создайте DbInitializer

    public class MyDbInitializer : IDatabaseInitializer<MyDbContext>
    {
       public void InitializeDatabase(MyDbContext context)
       {
          if (context.Database.Exists())
          {
            if (!context.Database.CompatibleWithModel(true))
            {
                context.Database.Delete();
            }
          }
          context.Database.Create();
    
          User myUser = new User()
          {
            Email = "[email protected]",
            Password = "secure-password"
          };
          context.Users.AddOrUpdate<User>(p => p.Email, myUser);
          context.SaveChanges();
       }
    }
    
  • Зарегистрируйте этот DbInitializer в свой метод Global.asax.cs Application_Start

    Database.SetInitializer(new My.namespace.MyDbInitializer());
    

Ответ 6

Мое семя тоже не исполнялось. Однако это связано с тем, что я добавил столбец к модели, которую я не собирался использовать в своей реальной базе данных, и забыл использовать аннотацию [NotMapped].

    [NotMapped]
    public string Pair { get; set; }

Не было никаких сообщений об ошибке, связанных с этим. Просто пустая ссылка на мой репозиторий obj, когда я пытался запросить данные, которые должны были быть там.