Idea: entità chiave, che può essere sostituita da un'altra chiave, se ciò accade, i loro FK si rivolgono l'un l'altro.
public class Key {
string Id;
string ReplacesId;
Key Replaces;
string ReplacedById;
Key ReplacedBy;
}
Mappatura fluente
modelBuilder.Entity<Key>().HasOne(k => k.Replaces)
.WithOne()
.HasForeignKey<Key>(k => k.ReplacesId)
.IsRequired(false);
modelBuilder.Entity<NagKey>().HasOne(k => k.ReplacedBy)
.WithOne()
.HasForeignKey<NagKey>(k => k.ReplacedById)
.IsRequired(false);
Problema: cercando di salvare un'entità, fallisce con l'errore di chiave esterna duplicata (che è null) come segue:
System.Data.SqlClient.SqlException: impossibile inserire la riga chiave duplicata nell'oggetto 'dbo.Keys' con l'indice univoco 'IX_Keys_ReplacedById'. Il valore della chiave duplicata è (). La dichiarazione è stata chiusa.
Risolto rendendo gli indici non unici:
modelBuilder.Entity<Key>()
.HasIndex(x => x.ReplacedById)
.IsUnique(false)
.HasFilter(null);
modelBuilder.Entity<Key>()
.HasIndex(x => x.ReplacesId)
.IsUnique(false)
.HasFilter(null);