EF将迁移迁移到新项目

时间:2016-04-29 17:56:55

标签: c# entity-framework entity-framework-6 ef-migrations

我正在重构一个项目,并希望将所有EF实体和代码优先迁移移动到一个新项目。我将_Migrations表中的ContextKey重命名为新的命名空间。运行添加迁移时,未检测到任何新更改(Up()和Down()为空)。 但是当我删除localdb时,不会重新创建db(它在移动之前就已经完成了)。显然,只有在移动后创建的迁移才会运行(但不应该)。

如何在创建新数据库时确保所有迁移(也包括移动之前的迁移)?

- 编辑 -

没关系:(

我将现有迁移拖放到新项目并重命名为migration.cs文件中的命名空间,但忘记了migration.Designer.cs背后的代码

2 个答案:

答案 0 :(得分:2)

您可以更新dbo._MigrationHistory表中的所有 ContextKey 列值,以匹配新命名空间及其全部。

对于我,我将所有代码的第一个模型从ASP.NET MVC应用程序移动到外部类库以与其他项目共享。

以下步骤可能会有所帮助

  1. 检查dbo._MigrationHistory,您可以看到所有记录都有 与Configuration类的确切类相匹配的类似值
  2. MyApp.Migrations.Configuration
    

    2.(测试步骤)从Package Manager控制台运行Update-Database并选择新的类库,您将看到例如下面的错误

    There is already an object named 'AspNetRoles' in the database.
    
    1. 更新_MigrationHistory表的ContextKey列中的所有记录以匹配新的命名空间
    2. MyApp.Domain.Migrations.Configuration
      

答案 1 :(得分:0)

引用表[__MigrationHistory]包含ContextKey列。除非另有说明,否则它会保留DbContext名称空间的成员资格值。

您可以设置一个派生自dbMigrationsConfiguration的类,并在构造函数中设置ContextKey值。

public sealed class Configuration : DbMigrationsConfiguration<Your.Context>
{
   public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
        ContextKey = "PreviousValue";
    }

    protected override void Seed(Your.Context context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}