Вот пара объектов в нашей базе данных
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; }
}
А вот как определяется отношение в контексте.
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);
Если вы попытаетесь использовать Event
с несколькимиQuestionEvents
, при котором значения Order
изменились, система выдает циклическую ошибку зависимости.
2018-09-20 10: 32: 35.252 +01: 00 [ERR] Невозможно выполнитьсохранить изменения, поскольку в данных, подлежащих сохранению, обнаружена циклическая зависимость:
'QuestionEvent [Modified]
<- Index {' EventId ',' Order '} QuestionEvent [Modified] <br><- Index {'EventId ',' Order '} QuestionEvent [Modified] <br><- Index {' EventId ',' Order '} QuestionEvent [Modified]'.</p>
Вот
Возможно, здесь происходит то, что EF не может обновить «заказ» из-за этого уникального ограничения - если порядок изменился, то во время процесса обновления, будет точка, в которой два объекта будут иметь одно и то же значение.
Чего я не вижу, так это того, есть ли выход из этой проблемы без перемещения этого ограничения.Как бы то ни было, я думаю об этом, у нас остается одна и та же проблема, пытаетесь ли вы выполнить обновления как отдельные транзакции, пакет или обернуть вещь в транзакцию (которую я пробовал).
Есть ли способ обойти это?