繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM