我有一个使用“haward”数据库架构的应用迁移。
public partial class CreateCourseCategoryTable : DbMigration
{
public override void Up()
{
CreateTable(
"haward.CourseCategories",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(),
Code = c.String(),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropTable("haward.CourseCategories");
}
}
有了这个映射
public class CourseCategoryMapping : EntityTypeConfiguration<CourseCategory>
{
public CourseCategoryMapping()
{
ToTable("CourseCategories", "haward");
}
}
现在我想将架构从“haward”更改为“tr”
我不想用这个添加迁移,所以我想直接编辑迁移和映射的源代码。
public partial class CreateCourseCategoryTable : DbMigration
{
public override void Up()
{
CreateTable(
"tr.CourseCategories",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(),
Code = c.String(),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropTable("tr.CourseCategories");
}
}
public class CourseCategoryMapping : EntityTypeConfiguration<CourseCategory>
{
public CourseCategoryMapping()
{
ToTable("CourseCategories", "tr");
}
}
然后重新创建空数据库并发出命令 update-database
但它说明我仍有待定的更改。
所以我所做的是发出 add-migration 命令来检查哪些更改是那些。即使没有迁移表,它似乎仍然可以检测到我的编辑(从“haward”到“tr”模式)。
模型更改保存在哪里?以及如何直接编辑源代码并重新应用迁移?我知道这是不可取的,因为这就是迁移的目的。但如果我只是处于早期开发阶段,我不想让我的历史只因这些变化而变得肮脏。
最佳答案
TL;博士:这非常复杂 - 稍后添加新迁移以纠正问题要容易得多。
Entity Framework 迁移由两部分组成 - 代码和模型的哈希。模型的散列用于确定模型是否已更改,从而确定是否需要进行任何新的迁移。
如果您更改模型,则会更改哈希。该哈希存储在 MigrationName.designer.cs 文件中。您不能只编辑模型并更改 migration.cs 代码,因为模型不再与模型哈希匹配。您还需要为模型重新生成哈希。
唯一的方法是回滚你的数据库,并更新哈希。
考虑您应用了 3 个迁移:
如果您想应用从 Migration2 开始的更改...
Update-Database -TargetMigration Migration1 -Force
(注意 - 这可能会导致数据丢失,因此请处理数据库的开发副本)Add-Migration xxxxxxxxxxx_Migration2
(使用迁移的全名,包括日期)。这只会更新designer.cs 文件Update-Database -TargetMigration Migration2
Add-Migration xxxxxxxxxxx_Migration3
Update-Database
关于entity-framework - 如何编辑以前应用的迁移而不先在 EF 代码中添加另一个迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21951697/