gpt4 book ai didi

asp.net-mvc - Postgres + EF Core 不区分大小写的唯一约束

转载 作者:行者123 更新时间:2023-12-04 15:31:49 25 4
gpt4 key购买 nike

我正在使用 Postgres + EF Core。我有一个名为 Name 的列,我希望它是唯一的。我尝试了以下方法:

builder.HasIndex(s => s.Name).IsUnique();

但这允许接受“test123”和“TEST123”。如何使用 fluent api 添加不区分大小写的唯一约束?

或者我是否只需要创建一个 NormalizedName 列并为其添加唯一约束。每次我想向列添加唯一约束时,似乎都需要做很多工作。

最佳答案

如果您使用的是 EF Core 5.0,请参见下文(可能是更好的解决方案)。否则,我通过使用 citext 添加了不区分大小写的检查。扩展如描述 here .有一些限制,我不会在这里列出它们,但您可以在上一个链接中或直接在 PostgreSQL Docs 上阅读它们。 .
还要确保您拥有 postgres-contrib安装包以使用此扩展。
首先,通过将扩展添加到模型构建器来启用扩展

modelBuilder.HasPostgresExtension("citext");
然后使用 citext作为列类型
builder.Property(s => s.Name)
.HasColumnType("citext")
英孚核心 5.0
使用 EF Core 5.0,可以通过使用 Collations 获得更好的支持.您也可以查看 Npgsql docs关于 PostrgeSQL。这克服了 citext 的一系列限制上面,给你更多的控制。
所以(未经测试的)步骤是:
  • 使用 ICU 创建归类作为数据库对象。这将创建一个非确定性的、不区分大小写的 ICU 排序规则。如果您需要其他东西,请查看 ICU docs .

  • modelBuilder.HasCollation("case_insensitive_collation", locale: "en-u-ks-primary", provider: "icu", deterministic: false);
  • 现在在你的专栏上,你可以添加:

  • builder.HasIndex(s => s.Name)
    .UseCollation("case_insensitive_collation")
    .IsUnique();
    如果你以其他方式实现它,我很想听听如何。

    关于asp.net-mvc - Postgres + EF Core 不区分大小写的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61133299/

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