我有类似的课
public class Foo
{
public virtual string Bar { get; set; }
// Other Stuff
}
现在需要将Bar视为CHAR(8),因此我将属性修改为
[StringLength(8)]
[Column(TypeName = "char")]
public virtual string Bar { get; set; }
项目中有许多迁移,通常是为现有类添加新类或新属性.我知道我可以生成一个更改列类型的新迁移,但最初将列创建为NVARCHAR(Max)然后将其更改为CHAR(8)似乎有点费解.我编辑了初始迁移,改变了
CreateTable(
"dbo.Foo",
c => new
{
Bar = c.String(),
// Other stuff
})
至
CreateTable(
"dbo.Foo",
c => new
{
Bar = c.String(maxLength: 8, fixedLength: true, storeType: "char", unicode: false),
// Other stuff
})
然后我删除了数据库并运行了一个使用上下文的程序,从而重新创建了数据库.
我在初始迁移中以及上次迁移结束时设置了断点.初始迁移完成后,表Foo将在新重新创建的数据库中创建,并具有预期的列类型CHAR(8).最后的迁移完成后,我尝试使用上下文,我得到一个AutomaticMigrationsDisabledException.
然后,我编写了一个迁移脚本,以查看差异所在的EF内容,并得到
public override void Up()
{
AlterColumn("dbo.Foo", "Bar", c => c.String(maxLength: 8, fixedLength: true, unicode: false));
}
public override void Down()
{
AlterColumn("dbo.Foo", "Bar", c => c.String());
}
Up()迁移正在执行创建表时已经完成的操作(并且物理上匹配模式),而Down()迁移希望将列更改为NVARCHAR(Max),这是从未进行过的.
题
为什么EF尝试执行这种看似不必要的迁移,我可以在不先创建NVARCHAR(Max)然后在新的单独迁移中将其更改为CHAR(8)的情况下更改列类型吗?
最佳答案
This link描述了迁移过程的内部.此处的问题与嵌入在资源文件中的比较模型有关,该模型用于在创建时生成的迁移.如果更改Up()Down()代码,则可能会影响生成的脚本,但不会影响初始比较模型.
建议不要更改这些模型,尽管此link显示了如何检查它们.建议的解决方法是创建新的迁移,以便将模型插入其资源文件中.使用-IgnoreChanges标志仅使用模型更新即可创建空白迁移.见https://msdn.microsoft.com/en-us/data/dn579398.aspx?f=255&MSPPError=-2147217396#option1