EF Core是否允許過濾/部分唯一索引不允許多個NULL?

c# ef-code-first entity-framework entity-framework-core

EF Core允許唯一(已過濾)索引包含多個NULL。

我可以將其配置為不允許多個NULL嗎?

假設我已經在屬性Column1Column2Column3定義了一個唯一索引:

config.Entity<Product>()
    .HasIndex("Column1", "Column2", "Column3")
    .IsUnique();

一個例子:

Id   Column1   Column2   Column3
1    100       "foo"     "bar"    // unique
2    100       "foo"     "bar"    // not allowed (dupe)
3    100       NULL      "bar"    // allowed
4    100       NULL      "bar"    // allowed - but I want this to fail
5    100       NULL      "bar"    // allowed - but I want this to fail
6    100       NULL      "bar"    // allowed - but I want this to fail

這就是我要的:

  • Row1獨一無二
  • Row2失敗(唯一約束違規),因為它是row1的欺騙
  • Row3允許,因為它與row1不同
  • Row4 / 5/6必須失敗,因為它們是row3的欺騙

但是第4/5/6行不會失敗。

一般承認的答案

我正在使用SQLite, 從索引中排除了NULL

遷移生成了這個:

CREATE UNIQUE INDEX [IX_Product] ON [Product] 
([Column1Id] ASC, [Column2Id] ASC, [Column3Id] ASC);

所以在遷移類中,我刪除了它,並用一個Sql("...")調用替換它:

CREATE UNIQUE INDEX [IX_Product] ON [Product] 
(COALESCE([Column1Id],"") ASC, COALESCE([Column2Id],"") ASC, COALESCE([Column3Id],"") ASC);

現在它強制執行NULL的唯一性。

(我在SQLite上測試了這個,不確定SQL Server。)



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow