[英]ASP.net Entity Framework Code First custom initializer never called
我在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);
}
...
}
问题是我的Initializer永远不会被调用,所以我的数据库永远不会被填充。 我什至尝试更改初始化程序来继承DropCreateDatabaseAlways,但是仍然一无所有……我在这里缺少什么?
编辑因此,在删除数据库后,我的初始化程序被调用为罚款。 但是我仍然想知道为什么在其他情况下没有调用它,例如当我添加一个表(因此更改了模型)或将Initialzer更改为DropCreateDatabaseAlways时。
我对SQL CE数据库使用了类似的配置,但不是使用DropCreate,而是使用CreateIfNotExists。
我和您所拥有的区别在于,您正在创建上下文并在数据库上调用initialize。 基于此,我建议您删除上下文设置和application_start方法中具有的Database.initialize调用。
尝试
Database.SetInitializer<MyContextName>(new EntitiesContextInitializer)
在EF 5.0中,该库声明为
public static void SetInitializer<TContext>(IDatabaseInitializer<TContext> strategy) where TContext : DbContext;
您可以将数据库迁移与代码优先结合使用。 每当您在模型更改时使用Update-database命令时,都会调用您的Seed方法(在Migrations中)。
本文介绍了更多信息:
http://msdn.microsoft.com/en-gb/data/jj591621
您也可以按以下方式在Application_Start()中强制使用它:
Database.SetInitializer(new EntitiesContextInitializer());
var context = new ToolkitContext();
context.Database.Initialize(true);
在类EntitiesContextInitializer的替代方法Seed的末尾,在该方法的末尾添加一行:
基本种子(上下文)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.