【问题标题】:Entity Framework can't migrate MaxLength value when column has index当列具有索引时,实体框架无法迁移 MaxLength 值
【发布时间】:2013-04-05 20:03:37
【问题描述】:

我尝试将 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 并在最后一次迁移中再次创建索引。但我相信应该有一种简单的方法来更改该属性值。

【问题讨论】:

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

标签: entity-framework entity-framework-6


【解决方案1】:

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

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

    /* Code to alter the table */

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2015-05-11
    • 2012-03-17
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多