Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF6代码首次添加迁移会创建异常迁移,但应用程序会运行_C#_Sql Server_Ef Code First_Entity Framework 6 - Fatal编程技术网

C# 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

我在VS2015中使用了EF6,并且在开发过程中进行了多次成功的迁移—直到现在。 我对表进行了更改以指定外键,并运行了添加迁移。我惊讶地发现,不仅是我预期的更改,而且许多具有字符串字段的现有表也在被修改

我反转了对外键的更改,但字符串字段的更改仍包含在迁移中。应用程序运行正常,因此数据库和模型看起来是同步的,但这种奇怪的迁移仍然存在

正在更改的表都基于以下接口和类:

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中有几个约定被删除了,但它们已经几个月没有更改了。谢谢,我将尝试一下。奇怪的是,这才刚刚开始,我在开发这个数据库的过程中进行了几十次迁移。不过,如果这能解决问题,我将非常感激。