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上提交并仔细查看更改的文件仍然没有任何线索

EF6代码首先添加迁移创建了不寻常的迁移,但应用程序运行

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));
}