问题描述
我的模型包含,除其他事项外,添加的初始创建和迁移后的模型类的两个属性。
My model contains, among other things, two properties that were added to the model class after its initial creation and migration.
public sealed class SomeModel
{
... other properties, which are fine.
public int PropertyOne { get; set; }
public int PropertyTwo { get; set; }
}
我最近的移民包括:
My most recent migration contains:
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
表中包含的条目为创建该表并添加列在迁移的迁移。
The target database contains the PropertyOne
and PropertyTwo
columns, and the __MigrationHistory
table contains entries for both the migration that created the table and the migration that added the columns.
当我运行添加迁移
来得到一些其他的变化,它也同样包括这两个属性:
When I run Add-Migration
to get some other changes, it also includes those two properties again:
public override void Up()
{
... other changes.
AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false));
AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false));
}
什么引起的?我也注意到,如果我恢复了我所有的模型的变化,并尝试了更新 - 数据库
(应该什么都不做),我得到的错误:
What could be causing this? I also notice that if I revert all of my model changes and try an Update-Database
(which should do nothing), I get the error:
无法更新数据库以匹配当前的模型,因为有 挂起的更改,并自动迁移被禁用。无论是写 挂起模式更改为code为基础的迁移或启用自动 迁移。设置DbMigrationsConfiguration.AutomaticMigrationsEnabled到 真正启用自动迁移。
什么引起的?
推荐答案
事实证明,还有就是你的了.Designer.cs
类模型的一个隐藏的快照与迁移有关。 (这是 IMigrationMetadata.Target
,而不是人工可读的。)的一系列问题引起的步骤是:
As it turns out, there is a hidden snapshot of your model in the .designer.cs
class associated with your migration. (This is IMigrationMetadata.Target
, and is not human-readable.) The series of steps that caused the problem were:
- 创建更改模型。
- 运行
添加迁移
以创建为改变迁移。 (这将创建隐藏的IMigrationMetadata.Target
值。) - 注意到,有在迁移建模的方式错误,直接更改模型类和移民类。 (该
IMigrationMetadata.Target
值现在出不同步。) - 运行
更新 - 数据库
以应用更改。
- Create changes to the model.
- Run
Add-Migration
to create the migration for the changes. (This creates the hiddenIMigrationMetadata.Target
value.) - Noticing that there are errors in the way the migration was modelled, change the model class and migration class directly. (The
IMigrationMetadata.Target
values is now out-of-sync.) - Run
Update-Database
to apply the changes.
要摆脱困境,用创建一个虚拟的迁移添加迁移虚拟
,然后删除一切从向上()
和向下()
的方法。
To get out of the mess, create a dummy migration using Add-Migration Dummy
, then delete everything from the Up()
and Down()
methods.
注意添加迁移
并就此发出警告;当您运行添加迁移
,它显示:
Note that Add-Migration
does warn you about this; when you run Add-Migration
, it displays:
在设计code为这种迁移文件中包含的快照您 目前的code首先模型。该快照用于计算 当你脚手架更改模型中的下一个迁移。如果你 让你想在这个包含到模型中的其他变化 迁移,那么你可以通过运行重新脚手架它添加迁移 假了。
警告只是没有任何意义,直到我想通了什么问题,看到隐藏的 IMigrationMetadata.Target
值。
The warning just didn't make any sense until I figured out what the problem was, and saw the hidden IMigrationMetadata.Target
value.
底线:不要手动保持你的模型和迁移向上()
方法同步;你必须重新执行添加迁移
正确设置隐藏的价值。
Bottom line: don't manually keep your model and migration Up()
methods in sync; you have to re-run Add-Migration
to set the hidden value correctly.
这篇关于code-首先加入迁移将保持在同一列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!