Ecco un paio di entità nel nostro database
public class Event
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public IList<QuestionEvent> Questions { get; set; }
}
public class QuestionEvent
{
public Event Event { get; set; }
public int EventId { get; set; }
public int Order { get; set; }
}
Ed ecco come viene definita la relazione nel contesto.
builder.Entity<QuestionEvent>().HasIndex(x => new
{
x.EventId,
x.Order
}).IsUnique();
builder.Entity<QuestionEvent>().HasOne(x => x.Event).WithMany(x => x.Questions).HasForeignKey(x => x.EventId);
builder.Entity<QuestionEvent>().HasOne(x => x.Question).WithMany(x => x.QuestionEvents).HasForeignKey(x => x.QuestionId);
Se si tenta di eseguire un Event
con più QuestionEvents
in cui i valori Order
sono stati modificati, il sistema genera un errore di dipendenza circolare.
2018-09-20 10: 32: 35.252 +01: 00 [ERR] Impossibile salvare le modifiche perché è stata rilevata una dipendenza circolare nei dati da salvare:
'QuestionEvent [Modificato]
<- Index {'EventId', 'Order'} QuestionEvent [Modified]
<- Index {'EventId', 'Order'} QuestionEvent [Modified]
<- Index {'EventId', 'Order'} QuestionEvent [Modified] '.
Ecco il
Ad esempio, ciò che sta accadendo qui è che EF non è in grado di aggiornare "ordine" a causa di quel vincolo univoco - se l'ordine è cambiato, allora durante il processo di aggiornamento, ci sarà un punto in cui è probabile che due entità abbiano lo stesso valore.
Quello che non riesco a vedere è se c'è un modo per uscire da questo problema senza spostare quel vincolo. Tuttavia, lo metto a tacere nella mia testa, ci rimane lo stesso problema, sia che tu provi a fare gli aggiornamenti come singole transazioni, un batch, o avvolgere la cosa in una transazione (che ho provato).
C'è un modo per aggirare questo?
È possibile salvare un valore fittizio in un'entità, aggiornare l'altra entità, quindi impostare il valore corretto nella prima entità. Questo può essere astratto scrivendo un metodo che utilizza EntityEntry
delle entità per verificare se il valore corrente delle proprietà dell'indice modificato è uguale a uno dei valori originali delle proprietà dell'indice modificato delle altre entità.