[英]How do you add a Unique case insensitive Index to a PostgresSQL table using EF Fluent API
我最近一直在使用 PostgreSQL 而不是 SQL,所以發現兩者之間有很多細微差別。
我希望能夠使表中的字符串值唯一,因此首先使用 EF 代碼流利 API,我有這段代碼。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyTable>()
.HasIndex(u => u.UniqueValue)
.IsUnique();
base.OnModelCreating(modelBuilder);
}
創建遷移時,它會生成這個。
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateIndex(
name: "IX_MyTable_UniqueValue",
table: "MyTable",
column: "UniqueValue",
unique: true);
}
然后,這會將索引添加到 PostgreSQL 表中,並在單詞大小寫相同時起作用。
例如,嘗試插入“Hello”兩次,但它不起作用。
它確實允許單詞的變體,所以我可以插入“Hello”、“HEllo”、“HELlo”等...
看起來可以使用類似的方法在 PostgreSQL 中的索引上強制大小寫
CREATE UNIQUE INDEX UniqueValue ON MyTable (UPPER(UniqueValue));
但是我不確定如何通過 EF Fluent API 執行此操作並從中創建遷移?
看起來現在你必須設置一個原始的 SQL 遷移。 對此的支持仍未添加(尚未)。 您還可以設置一個生成的(計算的)列來保存upper(UniqueValue)
的結果,然后在其上添加一個唯一索引。
無法添加基於表達式的唯一約束或將表達式添加到現有的唯一索引鍵。 您可以按原樣使用您的定義構建新索引:
CREATE UNIQUE INDEX UniqueValue ON MyTable (UPPER(UniqueValue));
或者添加一個排除約束,它最終會做幾乎相同的事情(截至目前,EF 還遠未支持):
create table test(txt text);
alter table test
add constraint case_insensitive_unique
exclude using gist(upper(txt) with =);
insert into test(txt) select 'hello';
--INSERT 0 1
insert into test(txt) select 'Hello';
--ERROR: conflicting key value violates exclusion constraint "case_insensitive_unique"
--DETAIL: Key (upper(txt))=(HELLO) conflicts with existing key (upper(txt))=(HELLO).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.