0

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

4 回答 4

0

您可以将数据库迁移与 Code-First 结合使用。每当您在模型更改时使用 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);
于 2012-12-21T17:33:19.140 回答
0

尝试

Database.SetInitializer<MyContextName>(new EntitiesContextInitializer)

在 EF 5.0 中,库被声明为

public static void SetInitializer<TContext>(IDatabaseInitializer<TContext> strategy) where TContext : DbContext;
于 2012-12-21T16:37:09.717 回答
0

我对 SQL CE 数据库使用了类似的配置,但我使用的是 CreateIfNotExists,而不是 DropCreate。
我和你的不同之处在于你正在创建一个上下文并在数据库上调用初始化。基于此,我建议您删除 application_start 方法中的上下文设置和 Database.initialize 调用。

于 2012-12-21T15:54:48.313 回答
0

在覆盖方法的末尾,Seed,在类 EntitiesContextInitializer 中,在方法的末尾添加一行:

base.Seed(上下文)

于 2012-12-26T13:25:16.933 回答