将 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)
{
}
}
希望这对遇到此问题的任何人有所帮助。很遗憾,它不应该更容易...
我目前有一个 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)
{
}
}
希望这对遇到此问题的任何人有所帮助。很遗憾,它不应该更容易...