Пакетное обновление Entity Framework нарушает ограничение IsUnique - PullRequest
0 голосов
/ 20 сентября 2018

Вот пара объектов в нашей базе данных

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 не может обновить «заказ» из-за этого уникального ограничения - если порядок изменился, то во время процесса обновления, будет точка, в которой два объекта будут иметь одно и то же значение.

Чего я не вижу, так это того, есть ли выход из этой проблемы без перемещения этого ограничения.Как бы то ни было, я думаю об этом, у нас остается одна и та же проблема, пытаетесь ли вы выполнить обновления как отдельные транзакции, пакет или обернуть вещь в транзакцию (которую я пробовал).

Есть ли способ обойти это?

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете сохранить фиктивное значение в одном объекте, обновить другой объект, а затем установить правильное значение в первом объекте.Это можно абстрагировать, написав метод, использующий сущности 'EntityEntry, чтобы проверить, совпадает ли текущее значение измененных свойств индекса с исходными значениями одного из других сущностей "измененных свойств индекса".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...