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

时间:2012-12-21 15:38:38

标签: c# asp.net entity-framework ef-code-first

我在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时。

4 个答案:

答案 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

您也可以按照自己的方式强制执行A​​pplication_Start():

Database.SetInitializer(new EntitiesContextInitializer());
            var context = new ToolkitContext();
            context.Database.Initialize(true);

答案 3 :(得分:0)

在重写方法结束时,种子,在类,实体ContextInitializer中,放置在方法的末尾添加一行:

base.Seed(context)