。净
除此之外,我的模型还包含在初始创建和迁移后添加到模型类中的两个属性。
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以启用自动迁移。
什么可能导致这个?
事实证明,与迁移相关的.designer.cs
类中存在模型的隐藏快照。 (这是IMigrationMetadata.Target
,不可读。)导致问题的一系列步骤是:
Add-Migration
迁移”为更改创建迁移。 (这会创建隐藏的IMigrationMetadata.Target
值。) IMigrationMetadata.Target
值现在不同步。) Update-Database
以应用更改。 要摆脱困境,请使用Add-Migration Dummy
创建虚拟迁移,然后从Up()
和Down()
方法中删除所有内容。
请注意, Add-Migration
确实会提醒您这一点; 当你运行Add-Migration
,它显示:
此迁移文件的设计器代码包含当前Code First模型的快照。 此快照用于在您为下一次迁移脚手架时计算对模型所做的更改。 如果您对要在此迁移中包含的模型进行其他更改,则可以通过再次运行“添加迁移虚拟”来重新搭建它。
直到我找出问题出在什么地方,并且看到隐藏的IMigrationMetadata.Target
值,警告才没有任何意义。
底线:不要手动让您的模型和迁移Up()
方法保持同步; 您必须重新运行Add-Migration
才能正确设置隐藏值。
Add-Migration YourMigrationName
Update-Database
在我看来,这是一种丑陋的工作,但这是我发现确保我的迁移具有所有变化的唯一方式。 我的猜测是实体框架在一段时间之后发生迁移,所以你必须创建一个新的。
链接地址: http://www.djcxy.com/p/90251.html上一篇: .net