我正在重构一个项目,并希望将所有EF实体和代码优先迁移移动到一个新项目。我将_Migrations表中的ContextKey重命名为新的命名空间。运行添加迁移时,未检测到任何新更改(Up()和Down()为空)。 但是当我删除localdb时,不会重新创建db(它在移动之前就已经完成了)。显然,只有在移动后创建的迁移才会运行(但不应该)。
如何在创建新数据库时确保所有迁移(也包括移动之前的迁移)?
- 编辑 -
没关系:(
我将现有迁移拖放到新项目并重命名为migration.cs文件中的命名空间,但忘记了migration.Designer.cs背后的代码
答案 0 :(得分:2)
您可以更新dbo._MigrationHistory表中的所有 ContextKey 列值,以匹配新命名空间及其全部。
对于我,我将所有代码的第一个模型从ASP.NET MVC应用程序移动到外部类库以与其他项目共享。
以下步骤可能会有所帮助
MyApp.Migrations.Configuration
2.(测试步骤)从Package Manager控制台运行Update-Database并选择新的类库,您将看到例如下面的错误
There is already an object named 'AspNetRoles' in the database.
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" }
// );
//
}
}