[英]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 Core 5.0 可以通過使用Collations獲得更好的支持。 您還可以查看有關 PostrgeSQL 的Npgsql 文檔。 這克服了上面citext
的一系列限制,並為您提供了更多控制權。
所以(未經測試的)步驟是:
modelBuilder.HasCollation("case_insensitive_collation", locale: "en-u-ks-primary", provider: "icu", deterministic: false);
builder.HasIndex(s => s.Name)
.UseCollation("case_insensitive_collation")
.IsUnique();
如果你以其他方式實現它,我很想聽聽如何。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.