首页 > 解决方案 > 使用条件唯一约束保存实体时出现循环依赖错误

问题描述

这是我在这里所做的后续工作:仅在 EF Core 中为“true”创建唯一约束

我有一个对两列具有唯一约束的表,RecordId并且IsPrimary. 表中每个只能有一个true值。迁移在表上创建了这个索引:RecordIdRecordAttachment

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已有另一个时- 即我的更新方法必须更新另一个附件并将其字段设置为容纳新附件 - 我在保存时遇到此异常对数据库的更改:AttachmentPrimaryIsPrimaryfalseIsPrimary

无法保存更改,因为在要保存的数据中检测到循环依赖:'索引:RecordAttachment.RecordId,RecordAttachment.IsPrimary Unique,索引:RecordAttachment.RecordId,RecordAttachment.IsPrimary Unique'。

虽然,我不知道循环依赖到底是什么。检查要保存的实体只有 2 个RecordAttachment实体,没有别的:1 个IsPrimary设置为false(previously true),另一个IsPrimary设置为true(previously false),两者都具有相同的RecordId.

标签: c#sql-serverentity-framework-core

解决方案


推荐阅读