Entity framework 实体框架可以';当列具有索引时,不迁移MaxLength值

Entity framework 实体框架可以';当列具有索引时,不迁移MaxLength值,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,我尝试将MaxLength属性从100更改为50,但得到的异常是 "The index 'IX_Singers_Name' is dependent on column 'Name'. ALTER TABLE ALTER COLUMN Name failed because one or more objects access this column." 模式为: public class Singer : NamedEntity { [MaxLength(50)] // It was

我尝试将MaxLength属性从100更改为50,但得到的异常是

"The index 'IX_Singers_Name' is dependent on column 'Name'.
ALTER TABLE ALTER COLUMN Name failed because one or more objects access this column."
模式为:

public class Singer : NamedEntity
{
    [MaxLength(50)] // It was 100
    public override string Name { get; set; }

}
据我所知,实体框架需要为此更改更改表,但它不能更改表,因为Name属性上存在索引。那么,我如何才能使实体框架迁移成为可能呢


我可以在迁移中删除索引,然后在下一次迁移中更改maxlength,并在最后一次迁移中再次创建索引。但我相信应该存在一种简单的方法来更改该属性值。

在SQL Server中,索引与表本身非常相似。因此,如果索引中有列,则需要修改该索引和表。我同意,如果EF迁移是为了添加索引而构建的(例如,对于外键),那么它们还应该注意删除和重新应用索引。但是,在这种情况下,必须手动添加索引。因此,需要在迁移过程中手动维护它。请注意,这可以在一次迁移中完成:

public override void Up() 
{
    DropIndex("dbo.Singer", new []{"Name"});

    /* Code to alter the table */

    CreateIndex("dbo.Singer", "Name");
}

不要忘了把它放在
Up()
Down()
方法中。

索引是如何创建的?我也不清楚您是想同时更改属性的值还是只更改属性的值(我认为后者是不可能的,因为这是代码首先用来构建数据库并验证模型是否与数据库匹配的内容),索引是通过迁移创建的。