【问题标题】:ASP.net Entity Framework Code First custom initializer never called从未调用过 ASP.net Entity Framework Code First 自定义初始化程序
【发布时间】:2012-12-21 15:38:37
【问题描述】:

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

【问题讨论】:

  • 您的连接字符串是否正确?您可以使用该上下文保存任何内容吗?
  • @IronMan84 是的,我连接良好。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试

    Database.SetInitializer<MyContextName>(new EntitiesContextInitializer)
    

    在 EF 5.0 中,库被声明为

    public static void SetInitializer<TContext>(IDatabaseInitializer<TContext> strategy) where TContext : DbContext;
    

    【讨论】:

      【解决方案3】:

      您可以将数据库迁移与 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);
      

      【讨论】:

      • 我正在使用数据库迁移。当我为新表添加 POCO 并进行更新时,会创建表,但从未在我的初始化程序上调用种子方法。我让它工作的唯一方法是手动删除现有的数据库。至于应用启动,如果已经尝试过将initialize改为true没有成功。
      • 它实际上是 DbMigrationsConfiguration 的 Seed 方法,在您进行迁移时调用,而不是初始化程序。示例:odetocode.com/Blogs/scott/archive/2012/08/31/…。尝试将您的代码放在那里。
      【解决方案4】:

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

      base.Seed(上下文)

      【讨论】:

        猜你喜欢
        • 2017-05-31
        • 2014-03-07
        • 2016-08-22
        • 1970-01-01
        • 2016-01-30
        • 1970-01-01
        • 2017-11-16
        • 1970-01-01
        • 2021-02-08
        相关资源
        最近更新 更多