这是我在此处所做的后续工作:Create Unique constraint for 'true' only in EF Core
我的表格在两列RecordId
和IsPrimary
上有唯一约束。 true
表中每RecordId
只能有一个RecordAttachment
值。迁移在表上创建了此索引:
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
附件 - 在将更改保存到数据库时出现此异常:
无法保存更改,因为在要保存的数据中检测到循环依赖关系:&#39;索引:RecordAttachment.RecordId,RecordAttachment.IsPrimary唯一,索引:RecordAttachment.RecordId,RecordAttachment.IsPrimary Unique&#39;。< / p>
虽然,我不知道循环依赖是什么。检查要保存的实体只有2个RecordAttachment
个实体,其他内容:1个IsPrimary
设置为false
(之前为true
),另一个设置为IsPrimary
设置为true
(之前为false
),并且都设置为RecordId
。