Ошибка циклической зависимости при сохранении объекта с условным уникальным ограничением - PullRequest
0 голосов
/ 30 апреля 2018

Это продолжение того, что я сделал здесь: Создание уникального ограничения для 'true' только в EF Core

У меня есть таблица с уникальным ограничением на два столбца, RecordId и IsPrimary. В таблице RecordAttachment может быть только одно значение true на RecordId. Миграция создала этот индекс для таблицы:

CREATE UNIQUE INDEX [IX_RecordAttachment_RecordId_IsPrimary] 
ON [RecordAttachment] ([RecordId], [IsPrimary]) 
WHERE [IsPrimary] = 1;

Чтобы справиться с этим на сервере, я написал свой метод репозитория для обновления существующего Первичного вложения при обновлении другого RecordAttachment, установленного как IsPrimary:

public async override Task<RecordAttachment> UpdateAsync(RecordAttachment item)
{
    if (item.IsPrimary)
    {
        RecordAttachment oldPrimaryAttachment = await _context.RecordAttachment
            .Where(ra => ra.RecordId == item.RecordId && ra.IsPrimary && ra.RecordAttachmentId != item.RecordAttachmentId)
            .SingleOrDefaultAsync();

        if (oldPrimaryAttachment != null)
        {
            oldPrimaryAttachment.IsPrimary = false;
            _context.RecordAttachment.Update(oldPrimaryAttachment);
        }
    }

    _context.RecordAttachment.Update(item);
    await _context.SaveChangesAsync();

    return item;
}

Однако теперь, когда я обновляю Attachment и устанавливаю его как Primary, когда уже есть еще один Attachment для текущей записи, установленной как Primary - т.е. мой метод обновления должен обновить другое вложение и установить его IsPrimary поле для false для размещения нового IsPrimary вложения - я получаю это исключение при сохранении изменений в базе данных:

Невозможно сохранить изменения, так как в данных, которые необходимо сохранить, обнаружена циклическая зависимость: 'Index: RecordAttachment.RecordId, RecordAttachment.IsPrimary Unique, Index: RecordAttachment.RecordId, RecordAttachment.IsPrimary Unique'.

Хотя я не знаю, что такое круговая зависимость. При проверке сохраняемых сущностей существует только 2 RecordAttachment сущностей и ничего больше: 1 с IsPrimary, установленным на false (ранее true), и другой с IsPrimary, установленным на true (ранее * 1037) *) и оба с одинаковыми RecordId.

...