C# EF6代码首次添加迁移会创建异常迁移,但应用程序会运行
我在VS2015中使用了EF6,并且在开发过程中进行了多次成功的迁移—直到现在。 我对表进行了更改以指定外键,并运行了添加迁移。我惊讶地发现,不仅是我预期的更改,而且许多具有字符串字段的现有表也在被修改 我反转了对外键的更改,但字符串字段的更改仍包含在迁移中。应用程序运行正常,因此数据库和模型看起来是同步的,但这种奇怪的迁移仍然存在 正在更改的表都基于以下接口和类:C# EF6代码首次添加迁移会创建异常迁移,但应用程序会运行,c#,sql-server,ef-code-first,entity-framework-6,C#,Sql Server,Ef Code First,Entity Framework 6,我在VS2015中使用了EF6,并且在开发过程中进行了多次成功的迁移—直到现在。 我对表进行了更改以指定外键,并运行了添加迁移。我惊讶地发现,不仅是我预期的更改,而且许多具有字符串字段的现有表也在被修改 我反转了对外键的更改,但字符串字段的更改仍包含在迁移中。应用程序运行正常,因此数据库和模型看起来是同步的,但这种奇怪的迁移仍然存在 正在更改的表都基于以下接口和类: public interface IModificationHistory { DateTime? DateModifie
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
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Types()
.Where(x => typeof(ModificationHistory) != x && typeof(ModificationHistory).IsAssignableFrom(x))
.Configure(x => x.Property("UserName").HasMaxLength(256));
}
我不知道是什么原因造成了这种情况,或者如何找到阻止这种奇怪变化的方法——有什么线索吗
更多有趣的信息。
我用奇怪的迁移更新了数据库,然后发现有一个模型错误,应用程序无法运行。我不得不从用户名字段中删除MaxLength属性,然后一切都正常了
重新添加该属性并摆弄MaxLength并没有产生一个包含任何内容的新迁移-似乎忽略了该属性,但仅在表继承自该类的情况下
很明显,我已经做了一些更改来实现这一点,但是提交到Git并仔细查看更改的文件仍然没有给我任何线索。没有[AttributeUsage(Inherited=True)]
注释,所以正如您所建议的,它在继承类中被忽略。在这种情况下,您应该在Fluent API的帮助下重复MaxLength
约束,如下所示:
public override void Up()
{
//snip
AlterColumn("dbo.Organisation", "UserName", c => c.String());
//snip
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Types()
.Where(x => typeof(ModificationHistory) != x && typeof(ModificationHistory).IsAssignableFrom(x))
.Configure(x => x.Property("UserName").HasMaxLength(256));
}
它在
Down
方法中生成了什么?它再次启用了长度限制:AlterColumn(“dbo.organization”,“UserName”,c=>c.String(maxLength:256));这绝对是奇怪的,不能复制干净的测试。这里没有显示任何特殊的代码-比如OnModelCreating
基于接口进行通用的fluent配置等。一定是其他原因造成的。OnModelCreating中有几个约定被删除了,但它们已经几个月没有更改了。谢谢,我将尝试一下。奇怪的是,这才刚刚开始,我在开发这个数据库的过程中进行了几十次迁移。不过,如果这能解决问题,我将非常感激。