【问题标题】:EF migration : Error changing an indexed field to nullableEF 迁移:将索引字段更改为可为空时出错
【发布时间】:2013-03-25 00:31:54
【问题描述】:

我最初迁移的代码如下

        CreateTable(
            "dbo.Sites",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Description = c.String(maxLength: 450)
                })
            .PrimaryKey(t => t.Id);

为了使描述字段是唯一的,我在 UP 方法的末尾添加了以下内容

CreateIndex("dbo.Sites", "Description", unique: true);

后来我决定将描述字段设为必填。

新的迁移会产生以下变化

AlterColumn("dbo.Sites", "Description", c => c.String(nullable: false, maxLength: 450));

但是,当此更改尝试运行时,我得到一个错误

ALTER TABLE ALTER COLUMN 描述失败,因为一个或多个对象访问此列。

我能够使用分析器隔离 SQL 行,因为

ALTER TABLE [dbo].[Sites] ALTER COLUMN [Description] nvarchar NOT NULL

当我在 Management Studio 中运行它时出现以下错误

消息 5074,第 16 级,状态 1,第 1 行 索引“IX_Description”取决于“描述”列。 消息 4922,第 16 级,状态 9,第 1 行 ALTER TABLE ALTER COLUMN 描述失败,因为一个或多个对象访问此列。

如何让迁移代码删除索引,然后更改更改列,然后重新构建索引?

我使用的是 SQL Server 2008 R2

【问题讨论】:

  • 对可为空的列使用唯一索引很奇怪。 Null 与其他任何值一样是值,因此只有一条记录能够具有 Null 值,否则您将收到唯一约束违规。
  • 我虽然是 NULL != NULL 但我认为我最近没有尝试过 - 值得一试。
  • 我希望空白成为组合框中的有效选项。我应该有 Null 还是空字符串?

标签: entity-framework-5 entity-framework-migrations


【解决方案1】:

大概是这样的吧?

DropIndex("dbo.Sites", "IX_Description");
AlterColumn("dbo.Sites", "Description", c => c.String(nullable: false, maxLength: 450));
CreateIndex("dbo.Sites", "Description", unique: true);

我想你也可以直接执行SQL如下。

Sql("DROP INDEX [IX_Description] ON [dbo].[Sites] WITH ( ONLINE = OFF )");

如果您想添加检查索引是否存在或其他内容,这可能很有用。

【讨论】:

  • 谢谢,您的回答有效。但是,如果索引不存在,则 SQL 替代方法会失败。
  • 是的,如果你想要那种健壮性,你需要有一个 IF EXISTS 语句。就我个人而言,我会从 SQL 管理工作室生成放置脚本并将其粘贴到其中,因为这通常包括该检查。
  • 我从管理工作室生成时没有看到支票。我做对了吗?右键单击索引和脚本索引 Drop To... 我确实在创建脚本中看到了一个设置。 DROP_EXISTING
  • IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[Sites]') AND name = N'IX_Description') Drop Index [IX_Description] on [dbo].[Sites]
  • Entity Framework 会根据您的模型类、数据注释和 Fluent API 映射自动生成迁移。在自动生成期间,它不知道您手动添加到迁移中的任何内容,因此它不知道此处需要 DropIndex。您也不能通过 Fluent API 添加索引。但是,如果您愿意,可以在这里找到投票的链接:stackoverflow.com/a/18694276/150342(以及有关索引的更多信息)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2014-08-16
  • 2011-08-23
  • 1970-01-01
  • 2011-01-14
  • 2020-07-30
  • 2016-09-10
相关资源
最近更新 更多