簡體   English   中英

Postgres + EF Core 的不區分大小寫的唯一約束

[英]Case insensitive unique constraint for Postgres + EF Core

我正在使用 Postgres + EF Core。 我有一個名為 Name 的列,我希望它是唯一的。 我嘗試了以下方法:

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

但這允許接受“test123”和“TEST123”。 如何使用流暢的 api 添加不區分大小寫的唯一約束?

還是我只需要創建一個 NormalizedName 列並向其中添加唯一約束。 每次我想向列添加唯一約束時,似乎需要做很多工作。

如果您使用的是 EF Core 5.0,請參見下文(可能是更好的解決方案)。 否則,我通過使用此處所述的citext擴展名添加了不區分大小寫的檢查。 有一些限制,我不會在這里列出它們,但您可以在上一個鏈接中閱讀它們或直接在PostgreSQL Docs上閱讀它們。

還要確保您安裝了postgres-contrib package 以使用此擴展。

首先,通過將擴展添加到 model 構建器來啟用擴展

modelBuilder.HasPostgresExtension("citext");

然后使用citext作為列類型

builder.Property(s => s.Name)
       .HasColumnType("citext")

EF 核心 5.0

使用 EF Core 5.0 可以通過使用Collations獲得更好的支持。 您還可以查看有關 PostrgeSQL 的Npgsql 文檔 這克服了上面citext的一系列限制,並為您提供了更多控制權。

所以(未經測試的)步驟是:

  1. 使用 ICU 創建一個排序規則作為數據庫 object。 這將創建一個不確定的、不區分大小寫的 ICU 排序規則。 如果您需要其他內容,請查看ICU 文檔
modelBuilder.HasCollation("case_insensitive_collation", locale: "en-u-ks-primary", provider: "icu", deterministic: false);
  1. 現在在你的專欄上,你可以添加:
builder.HasIndex(s => s.Name)
       .UseCollation("case_insensitive_collation")
       .IsUnique();

如果你以其他方式實現它,我很想聽聽如何。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM