Asp.net mvc Postgres+;的不区分大小写的唯一约束;EF核心
我正在使用Postgres+EF Core。我有一个名为Name的列,我希望它是唯一的。我尝试了以下方法: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,请参阅下面的内容(可能是更好的
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
的一系列限制,并为您提供了更多的控制
因此(未经测试的)步骤是:
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
的一系列限制,并为您提供了更多的控制
因此(未经测试的)步骤是:
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
上进行链接。我想,至少在这个指数应该是唯一的这一点上,它的意图更加清晰了?