Asp.net mvc Postgres+;的不区分大小写的唯一约束;EF核心

Asp.net mvc Postgres+;的不区分大小写的唯一约束;EF核心,asp.net-mvc,postgresql,asp.net-core,entity-framework-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,请参阅下面的内容(可能是更好的

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

builder.HasIndex(s => s.Name).IsUnique();
但这允许接受“test123”和“test123”。如何使用fluent api添加不区分大小写的唯一约束


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

如果您使用的是EF Core 5.0,请参阅下面的内容(可能是更好的解决方案)。否则,我通过使用
citext
扩展添加了一个不区分大小写的检查,如上所述。有一些限制,我不会在这里列出它们,但你可以在上一个链接或直接在网站上阅读它们

另外,请确保已安装
postgres contrib
软件包以使用此扩展

首先,通过将扩展添加到模型生成器中来启用它

modelBuilder.HasPostgresExtension(“citext”);
然后使用
citext
作为列类型

builder.Property(s=>s.Name)
.HasColumnType(“citext”)
EF核心5.0 在EF Core 5.0中,通过使用提供了更好的支持。您还可以查看有关PostrgeSQL的。这克服了上面的
citext
的一系列限制,并为您提供了更多的控制

因此(未经测试的)步骤是:

  • 使用ICU创建排序规则作为数据库对象。这将创建一个不确定的、不区分大小写的ICU排序规则。如果你还需要其他东西,请查看
  • modelBuilder.hascolation(“不区分大小写的排序”,区域设置:“en-u-ks-primary”,提供程序:“icu”,确定性:false);
    
  • 现在,在您的专栏中,您可以添加:
  • builder.HasIndex(s=>s.Name)
    .UseCollation(“不区分大小写的排序”)
    .IsUnique();
    

    如果您是通过其他方式实现的,我很想听听您是如何做到的。

    如果您使用的是EF Core 5.0,请参见下文(可能是更好的解决方案)。否则,我通过使用
    citext
    扩展添加了一个不区分大小写的检查,如上所述。有一些限制,我不会在这里列出它们,但你可以在上一个链接或直接在网站上阅读它们

    另外,请确保已安装
    postgres contrib
    软件包以使用此扩展

    首先,通过将扩展添加到模型生成器中来启用它

    modelBuilder.HasPostgresExtension(“citext”);
    
    然后使用
    citext
    作为列类型

    builder.Property(s=>s.Name)
    .HasColumnType(“citext”)
    
    EF核心5.0 在EF Core 5.0中,通过使用提供了更好的支持。您还可以查看有关PostrgeSQL的。这克服了上面的
    citext
    的一系列限制,并为您提供了更多的控制

    因此(未经测试的)步骤是:

  • 使用ICU创建排序规则作为数据库对象。这将创建一个不确定的、不区分大小写的ICU排序规则。如果你还需要其他东西,请查看
  • modelBuilder.hascolation(“不区分大小写的排序”,区域设置:“en-u-ks-primary”,提供程序:“icu”,确定性:false);
    
  • 现在,在您的专栏中,您可以添加:
  • builder.HasIndex(s=>s.Name)
    .UseCollation(“不区分大小写的排序”)
    .IsUnique();
    

    如果您通过其他方式实现了这一点,我很想听听您是如何做到的。

    使用npgsql的预览版(当前最新版本为5.0.0-rc1),然后是的,您可以。谢谢,如果您有两个不区分大小写的列,并且它们需要在一起是唯一的。使用属性使它们不区分大小写,然后添加唯一索引,还是像您那样添加具有排序规则的唯一索引更好?如果使用索引,列还会使用该索引之外的排序规则吗?这是一个很好的问题,我不确定排序规则本身是否是“继承的”。也许你可以试一下。但是我想我可能会尝试在
    .HasIndex(p=>new{p.FirstColumn,p.SecondColumn})
    列上创建一个索引,然后在
    UseCollation
    上进行链接。至少,我认为索引应该是唯一的,这一点更清楚了?使用npgsql的预览版(当前最新版本为5.0.0-rc1),然后是可以的。谢谢,如果您有两个不区分大小写的列,并且它们需要一起是唯一的。使用属性使它们不区分大小写,然后添加唯一索引,还是像您那样添加具有排序规则的唯一索引更好?如果使用索引,列还会使用该索引之外的排序规则吗?这是一个很好的问题,我不确定排序规则本身是否是“继承的”。也许你可以试一下。但是我想我可能会尝试在
    .HasIndex(p=>new{p.FirstColumn,p.SecondColumn})
    列上创建一个索引,然后在
    UseCollation
    上进行链接。我想,至少在这个指数应该是唯一的这一点上,它的意图更加清晰了?