EF6代码首次添加迁移会创建异常迁移,但应用程序会运行

时间:2016-09-23 00:28:24

标签: c# sql-server ef-code-first entity-framework-6

我在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属性,然后一切正常。

重新添加属性并摆弄MaxLength并没有产生包含任何内容的新迁移 - 似乎忽略了该属性,但仅限于从该类继承的表。

显然我已经改变了一些事情来实现这一点,但是对Git进行提交并仔细查看已更改的文件仍然没有给我任何线索。

1 个答案:

答案 0 :(得分:0)

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