我正在使用 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
的一系列限制上面,给你更多的控制。所以(未经测试的)步骤是:
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/