我有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);
}
}
据我所知,只有在执行查询等操作后才会调用种子方法。我的数据库创建成功,我正在查询表,但是种子方法永远不会被调用。
更新
似乎问题是由于我的inheriting
类中的DatabaseContext
类引起的,当使用此类执行数据库操作时,不会调用种子方法。使用我的DatabaseContext
课程时,一切都按预期工作
public DbSet<TestEntity> TestEntity { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
答案 0 :(得分:14)
您需要从Update-Database
致电Package Manager Console
。
答案 1 :(得分: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>();
}
这里我从
更改了我的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 :(得分:3)
要在使用Seed
不时调用AutomaticMigration
方法,您应该为代码优先数据库使用MigrateDatabaseToLatestVersion
初始化程序。 />
像这样:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourContext,YourConfiguration>());
这样,每次成功完成迁移时都会调用Seed
方法。
答案 3 :(得分:0)
我有这个问题,问题是我的Context构造函数没有使用与我的web.config中相同的名称。
答案 4 :(得分:0)
如果您使用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 = "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());
答案 5 :(得分:0)
我的种子也没被处决。但是,这是因为我在模型中添加了一个列,我无意在实际数据库中使用该列,忘记使用[NotMapped]注释。
[NotMapped]
public string Pair { get; set; }
根本没有与此相关的错误消息。当我尝试查询应该存在的数据时,只是对我的存储库obj的空引用。
答案 6 :(得分:0)
如果您的Update-Database命令未成功运行,则可能发生这种情况,这并不一定意味着它会出错。某些可能被EF识别为“出色”的更改需要添加到迁移中。
尝试调用“ Add-Migration {migrationNameHere}”,然后再次尝试“ Update-Database”。