gpt4 book ai didi

c# - EF 6.1 唯一可空索引

转载 作者:IT王子 更新时间:2023-10-29 03:55:37 25 4
gpt4 key购买 nike

在使用 Code First 的 EF 6.1 中,您可以使用实体中的属性或按照以下方式使用流畅的 API 创建索引:

 Property(x => x.PropertyName)
.IsOptional()
.HasMaxLength(450)
.HasColumnAnnotation("Index",
new IndexAnnotation(new IndexAttribute("IX_IndexName") {IsUnique = true, }));

有没有什么方法可以像在 SQL Server 中一样使用 WHERE PropertyName IS NOT NULL 脚手架(参见:https://stackoverflow.com/a/767702/52026)?

最佳答案

我没有找到告诉 EF 使用此 where 子句的方法,但这里有一些解决方法。检查它是否适合您的情况。

  1. 安装 Entity Framework ,在 app.config 中定义您的 DbContext、实体、conn 字符串等。
  2. 启用迁移 - 在程序包管理器控制台“-EnableMigration”中运行
  3. 创建 DbMigration - 在程序包管理器控制台“Add-Migration MigrationName”中运行
  4. 在 ovverided Up 方法中创建的 DbMigration 类中运行您的 sql 以创建唯一的可空索引。

代码:

// Add unique nullable index 
string indexName = "IX_UQ_UniqueColumn";
string tableName = "dbo.ExampleClasses";
string columnName = "UniqueColumn";

Sql(string.Format(@"
CREATE UNIQUE NONCLUSTERED INDEX {0}
ON {1}({2})
WHERE {2} IS NOT NULL;",
indexName, tableName, columnName));

注意:不要忘记也创建降级。 Ovveride Down 方法并在里面使用 DropIndex 方法:

DropIndex(tableName, indexName);

如果您的数据库中已经有可能与唯一索引约束冲突的数据,您可能还需要一些额外的代码。

注意:在这里您可以使用 CreateIndex 方法,但我无法用它创建正确的索引。 EF 只是忽略我的 anonymousArguments 或我写错了。您可以自己尝试并在此处写下您的结果。语法如下:

CreateIndex(
table: "dbo.ExampleClasses",
columns: new string[] { "UniqueColumn" },
unique: true,
name: "IX_UniqueColumn",
clustered: false,
anonymousArguments: new
{
Include = new string[] { "UniqueColumn" },
Where = "UniqueColumn IS NOT NULL"
});

<罢工> 5 尝试为唯一列和其他相等值添加两个具有空值的元素。

这是我的演示代码 - Pastebin

关于c# - EF 6.1 唯一可空索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com