我在Asp.net项目中使用EF Code First。 Code First创建了我的数据库,但是我很适合用数据为我的数据库播种。我正在使用这样的自定义数据库初始化程序:
namespace Toolkit.Model
{
public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<ToolkitContext>
{
protected override void Seed(ToolkitContext context)
{
List<Server> Servers = new List<Server>
{
new Server { ServerName = "Server 16" },
new Server { ServerName = "Server 29" }
};
foreach (Server server in Servers)
{
context.Servers.Add(server);
}
context.SaveChanges();
}
}
}
我在Global.asax.cs中设置初始化程序并强制数据库初始化如下:
using Toolkit.Model;
namespace Toolkit
{
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
Database.SetInitializer(new EntitiesContextInitializer());
var context = new ToolkitContext();
context.Database.Initialize(false);
}
...
}
问题是我的初始化程序永远不会被调用,因此我的数据库永远不会被填充。我甚至尝试更改初始化程序以继承DropCreateDatabaseAlways但仍然没有...我在这里缺少什么?
修改 删除数据库后,我的初始化程序被称为罚款。但是我仍然想知道为什么在其他实例中没有调用它,例如当我添加一个表(因此模型已更改)或者我将初始化器更改为DropCreateDatabaseAlways时。
答案 0 :(得分:0)
我正在为SQL CE数据库使用类似的配置,但我使用CreateIfNotExists而不是DropCreate。 我和你的不同之处在于你正在创建一个上下文并在数据库上调用initialize。基于此,我建议您删除application_start方法中的上下文设置和Database.initialize调用。
答案 1 :(得分:0)
尝试
Database.SetInitializer<MyContextName>(new EntitiesContextInitializer)
在EF 5.0中,库被声明为
public static void SetInitializer<TContext>(IDatabaseInitializer<TContext> strategy) where TContext : DbContext;
答案 2 :(得分:0)
您可以将数据库迁移与代码优先一起使用。无论何时在模型更改时使用Update-database命令,都将调用Seed方法(在迁移中)。
本文解释更多:
http://msdn.microsoft.com/en-gb/data/jj591621
您也可以按照自己的方式强制执行Application_Start():
Database.SetInitializer(new EntitiesContextInitializer());
var context = new ToolkitContext();
context.Database.Initialize(true);
答案 3 :(得分:0)
在重写方法结束时,种子,在类,实体ContextInitializer中,放置在方法的末尾添加一行:
base.Seed(context)