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。

ASP.net实体框架代码第一个自定义初始化器从未被调用

我正在使用一个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类中,在方法的末尾添加一行:

基地。种子(上下文)