我的模型包含两个在初始创建和迁移后添加到模型类中的属性。
public sealed class SomeModel
{
... other properties, which are fine.
public int PropertyOne { get; set; }
public int PropertyTwo { get; set; }
}
我最近的迁移包含:
public override void Up()
{
... other table being created.
AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false));
AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false));
}
目标数据库包含PropertyOne
和PropertyTwo
列,__MigrationHistory
表包含创建表的迁移和添加列的迁移的条目。
当我运行Add-Migration
进行其他更改时,它还会再次包含这两个属性:
public override void Up()
{
... other changes.
AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false));
AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false));
}
可能导致这种情况的原因是什么?我还注意到,如果我恢复所有模型更改并尝试Update-Database
(应该什么也不做),我会收到错误:
无法更新数据库以匹配当前模型,因为有 挂起的更改和自动迁移已禁用。要么写 待定模型更改为基于代码的迁移或启用自动 移民。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为 如果启用自动迁移,则为true。
可能导致此问题的原因是什么?
答案 0 :(得分:9)
事实证明,与您的迁移相关联的.designer.cs
类中存在隐藏的模型快照。 (这是IMigrationMetadata.Target
,并且不是人类可读的。)导致问题的一系列步骤是:
Add-Migration
以创建更改的迁移。 (这会创建隐藏的IMigrationMetadata.Target
值。)IMigrationMetadata.Target
值现在不同步。)Update-Database
以应用更改。要摆脱困境,请使用Add-Migration Dummy
创建虚拟迁移,然后从Up()
和Down()
方法中删除所有内容。
请注意,Add-Migration
会对此发出警告;当您运行Add-Migration
时,它会显示:
此迁移文件的Designer代码包含您的快照 当前Code First模型。此快照用于计算 在您构建下一次迁移时更改模型。如果你 对要包含在其中的模型进行其他更改 迁移,然后您可以通过运行“添加迁移”重新构建它 再次假人。
在我弄清问题是什么之前,这个警告没有任何意义,并且看到了隐藏的IMigrationMetadata.Target
值。
结论:不要手动保持模型和迁移Up()
方法同步;您必须重新运行Add-Migration
才能正确设置隐藏值。
答案 1 :(得分:0)
Add-Migration YourMigrationName
Update-Database
在我看来,这是一种丑陋的工作,但这是我发现的唯一方法,以确保我的迁移具有所有的变化。我的猜测是实体框架在一段时间后使迁移过时,因此您必须创建一个新的。