将 Entity framework 从 MVC 移动到另一个项目会导致重新迁移

Moving Entity framework to another project from MVC causes re-migration

我目前有一个 asp.net MVC 4 应用程序,其中包含 Entity framework 6 个代码优先模型、DbContext 和迁移。为了将它与我的 Web 应用程序分开,以便我可以在另一个项目中重新使用这些数据库 类,我已将所有相关的 Entity Framework 类 移动到他们自己的项目中。

但是现在当我 运行 解决方案时,它认为我的模型已经改变并尝试再次 运行 我的所有迁移。问题似乎出在我对 SetInitializer 的使用上,就好像我注释掉了这一行一样,我可以 运行 网络应用程序正常运行。

public static class DatabaseConfig
{
    public static void Initialize()
    {
       System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<G5DataContext, Configuration>());

        // make sure the database is created before SimpleMembership is initialised
        using (var db = new G5DataContext()) 
            db.Database.Initialize(true);
    }
}

这不是问题,直到我尝试移动所有 Entity Framework 类。这是不可能的,还是我做错了什么?

启动时,EF6 会查询数据库中的退出迁移,如存储在 __MigrationHistory table 中一样。 table 的一部分是上下文键,其中包括实体的命名空间。

如果您将所有内容移动到新命名空间,EF6 将无法识别之前的任何 运行 迁移,并会尝试重建数据库。

一个快速的解决方案是 运行 脚本将 __MigrationHistory table 中的上下文键重命名为您的新命名空间。来自 http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/ :

UPDATE [dbo].[__MigrationHistory] 
   SET [ContextKey] = 'New_Namespace.Migrations.Configuration'
 WHERE [ContextKey] = 'Old_Namespace.Migrations.Configuration'

还想补充一点,您应该记得更改配置 class 中的 ContextKey 属性。我做了上面的,但它仍在尝试创建一个新的数据库。这是一个例子:

之前:

internal sealed class Configuration : DbMigrationsConfiguration<PricedNotesContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        ContextKey = "Synapse.DAL.PricedNotesContext";
    }

    protected override void Seed(PricedNotesContext context)
    {
    }
}

之后:

internal sealed class Configuration : DbMigrationsConfiguration<PricedNotesContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        ContextKey = "SynapseDomain.DAL.PricedNotesContext";
    }

    protected override void Seed(PricedNotesContext context)
    {
    }
}

希望这对遇到此问题的任何人有所帮助。很遗憾,它不应该更容易...