Это продолжение того, что я сделал здесь: Создание уникального ограничения для '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
.