未调用种子方法,实体框架6
本文关键字:实体 框架 子方法 调用 种子 | 更新日期: 2023-09-27 18:19:48
我有一个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方法只有在执行诸如查询之类的操作时才会被调用。我的数据库创建成功,我正在查询表,但从未调用种子方法。
更新:
这个问题似乎是由我的DatabaseContext
类中的inheriting
类引起的,当使用该类执行数据库操作时,不会调用种子方法。当使用我的DatabaseContext
类时,一切都按预期工作
public DbSet<TestEntity> TestEntity { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
您需要从Package Manager Console
调用Update-Database
。
我能做到这一点的唯一方法是自己调用种子方法
以下是我的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);
}
}
如果更新数据库命令没有成功运行,就会发生这种情况,但这并不一定意味着它会出错。可能存在EF识别为";杰出的";需要添加到迁移中。
尝试调用";添加迁移{migrationNameHere}"然后尝试";更新数据库";再一次
若要在而不是使用AutomaticMigration
时调用Seed
方法,应为代码优先数据库使用MigrateDatabaseToLatestVersion
初始值设定项
像这样:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourContext,YourConfiguration>());
这样,每次迁移成功时都会调用Seed
方法。
我遇到了这个问题,问题是我的上下文构造函数没有使用与web.config中相同的名称。
如果使用"代码优先",则可以在应用程序首次运行时填充数据。
-
创建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 = "a@b.com", Password = "secure-password" }; context.Users.AddOrUpdate<User>(p => p.Email, myUser); context.SaveChanges(); } }
-
在Global.asax.cs Application_Start方法中注册此DbInitializer
Database.SetInitializer(new My.namespace.MyDbInitializer());
我的种子也没有被执行。然而,这是因为我在模型中添加了一列,而我无意在实际数据库中使用它,并且忘记了使用[NotMapped]注释。
[NotMapped]
public string Pair { get; set; }
根本没有与此相关的错误消息。当我试图查询本应存在的数据时,只是对我的存储库obj的空引用。