EF6代码首先添加迁移创建了不寻常的迁移,但应用程序运行
本文关键字:迁移 运行 应用程序 不寻常 创建 代码 添加 EF6 | 更新日期: 2023-09-27 18:08:28
我在VS2015中使用EF6,并且在我开发的过程中有很多很多成功的迁移-直到现在。我对一个表进行了更改,以指定外键并运行add-migration。我很惊讶地看到,不仅是我所期望的改变,而且许多现有的有字符串字段的表也被修改了。
我撤消了对外键的更改,但是字符串字段的更改仍然包含在迁移中。应用程序运行正常,所以数据库和模型看起来是同步的,但是这个奇怪的迁移仍然存在。
被更改的表都基于以下接口和类:
public interface IModificationHistory
{
DateTime? DateModified { get; set; }
DateTime? DateCreated { get; set; }
string UserName { get; set; }
}
public class ModificationHistory : IModificationHistory
{
[JsonIgnore]
[Display(Name = "Date modified")]
public DateTime? DateModified { get; set; }
[JsonIgnore]
[Display(Name = "Date created")]
public DateTime? DateCreated { get; set; }
[JsonIgnore]
[DataType(DataType.Text), MaxLength(256)]
[Display(Name = "User name")]
public string UserName { get; set; }
}
例如
public class Organisation : ModificationHistory
{
[Key]
public int Id { get; set; }
[Required]
[DataType(DataType.Text), MaxLength(10)]
[Display(Name = "Code")]
public string Code { get; set; }
[Required]
[DataType(DataType.Text), MaxLength(255)]
[Display(Name = "Name")]
public string Name { get; set; }
}
现在新的迁移突然想要改变字符串长度,并且忽略了MaxLength(256)属性。这将发生在指定了此继承的所有表中。
它看起来像这样:
public override void Up()
{
//snip
AlterColumn("dbo.Organisation", "UserName", c => c.String());
//snip
}
我不知道是什么导致了这种情况,或者如何找到如何阻止迁移使这种奇怪的变化-任何线索?
更多有趣的信息
我用奇怪的迁移更新了数据库,然后发现有一个模型错误,应用程序无法运行。我不得不从用户名字段中删除MaxLength属性,然后一切都OK了。
重新添加属性并摆弄MaxLength并没有产生包含任何内容的新迁移-似乎该属性被忽略了,但只有在表从该类继承的地方。
显然我已经修改了一些东西来实现这一点,但是在Git上提交并仔细查看更改的文件仍然没有任何线索
MaxLengthAttribute没有[AttributeUsage (Inherited = True)]
注释,因此它在继承类中被忽略,正如您所建议的。在这种情况下,应该在Fluent API的帮助下重复MaxLength
约束,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Types()
.Where(x => typeof(ModificationHistory) != x && typeof(ModificationHistory).IsAssignableFrom(x))
.Configure(x => x.Property("UserName").HasMaxLength(256));
}