ASP.net实体框架代码第一个自定义初始化器从未被调用
本文关键字:调用 初始化 自定义 实体 net 框架 代码 第一个 ASP | 更新日期: 2023-09-27 17:49:24
我在一个Asp.net项目中使用EF 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。
我正在使用一个SQL CE数据库的类似配置,但不是DropCreate,我使用CreateIfNotExists。
我和你的不同之处在于你创建了一个上下文并在数据库上调用initialize。基于此,我建议您删除上下文设置和数据库。初始化application_start方法中的调用
try
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);
在您的重写方法Seed的末尾,在EntitiesContextInitializer类中,在方法的末尾添加一行:
基地。种子(上下文)