Метод семян не называется, 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, когда я пытался запросить данные, которые должны были быть там.