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

标签 asp.net-mvc postgresql asp.net-core entity-framework-core

我正在使用 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/

    相关文章:

    c# - IsPersistent 不起作用 - Cookie 仅对当前 session 有效

    c# - Windows 身份验证混合

    asp.net-mvc - 无法让渐变延伸到浏览器底部

    java - JDBC 连接池 : connections are not recycled after DB restart

    c# - ASP .NET Core Identity 自定义 ApiAuthorizationDbContext

    c# - DbContext 在 Async 方法中处理得太早

    asp.net-mvc - OutputCache 不缓存 RedirectResult

    postgresql - 在 Windows10 上的 Postgresql 中创建 utf-8 数据库

    Spring 应用程序不在 Postgres 数据库上创建表

    asp.net-core - 使用 UseStatusCodePagesWithReExecute 时,状态代码不会发送到浏览器