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

我目前有一个asp.net MVC 4应用程序,它包含Entity框架6 Code First模型,DbContext和Migrations。 为了将它与我的Web应用程序分开,以便我可以在另一个项目中重用这些数据库类,我已将所有相关的Entity Framework类移动到它们自己的项目中。

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

 public static class DatabaseConfig { public static void Initialize() { System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion()); // make sure the database is created before SimpleMembership is initialised using (var db = new G5DataContext()) db.Database.Initialize(true); } } 

在我尝试移动所有Entity Framework类之前,这不是问题。 这是不可能的,还是我做了一些根本错误的事情?

启动时,EF6查询退出数据库中的迁移,存储在__MigrationHistory表中。 该表的一部分是上下文密钥,其中包括实体的名称空间。

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

一个快速的解决方案是运行一个脚本,将__MigrationHistory表中的上下文键重命名为新的命名空间。 来自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' 

还要补充一点,您应该记得在Configuration类中更改ContextKey属性。 我做了以上但仍然在尝试创建一个新的数据库。 这是一个例子:

之前:

 internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = false; ContextKey = "Synapse.DAL.PricedNotesContext"; } protected override void Seed(PricedNotesContext context) { } } 

后:

 internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = false; ContextKey = "SynapseDomain.DAL.PricedNotesContext"; } protected override void Seed(PricedNotesContext context) { } } 

希望这可以帮助任何坚持这一点的人。 遗憾的是它应该不容易……