EF Core consente a un indice univoco (filtrato) di contenere più NULL.
Posso configurarlo per non consentire più NULL?
Supponiamo che abbia definito un indice univoco sulle proprietà Column1
, Column2
, Column3
:
config.Entity<Product>()
.HasIndex("Column1", "Column2", "Column3")
.IsUnique();
Un esempio:
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
Questo è quello che voglio:
Ma row4 / 5/6 non fallire.
Sto usando SQLite, che esclude i NULL dall'indice.
La migrazione genera questo:
CREATE UNIQUE INDEX [IX_Product] ON [Product]
([Column1Id] ASC, [Column2Id] ASC, [Column3Id] ASC);
Quindi nella classe di migrazione l'ho rimosso e sostituito con una chiamata Sql("...")
con:
CREATE UNIQUE INDEX [IX_Product] ON [Product]
(COALESCE([Column1Id],"") ASC, COALESCE([Column2Id],"") ASC, COALESCE([Column3Id],"") ASC);
E ora applica l'unicità dei NULL.
(L'ho provato su SQLite, non sono sicuro di SQL Server.)