我的父母有多个孩子。父级子级具有boolean类型的属性。只有一个孩子可以拥有true属性。我已经这样创建了EF索引:
migrationBuilder.CreateIndex(
name: "....",
table: "ChildTable",
columns: new[] { "ParentId", "Property" },
unique: true,
filter: "[Property] = 1");
一切正常,直到您尝试更新记录。
如果父级有两个孩子,而第二个孩子的属性为true,则我要更新两个孩子,以使第一个孩子的属性为true,而第二个孩子的属性为false,我将得到一个异常:“无法插入具有唯一索引的对象'ChildTable'中的重复键行...”
Parent1 Child1 False => Parent1 Child1 True Parent1 Child2 True => Parent1 Child2 False
除删除索引外,EF中是否可以解决此问题? (同样,我也不想先保存全部为false,然后将true设置为子级-意味着2保存在数据库中)
更新
此处要求提供的代码
var originalChildrens = originalEntity.Children;
foreach (var child in originalChildrens)
{
var childModel = model.Children.FirstOrDefault(u => u.Id == child.ID);
if (childModel == null)
{
parent.Children.Add(child);
Context.Entry(child).State = EntityState.Deleted;
}
else
{
parent.Children.Add(Mapper.Map<ChildClass>(childModel));
}
}
var addedChildren = model.Children.Where(uvm =>
originalChildrens?.FirstOrDefault(ilu => ilu.ID == uvm.Id) == null);
foreach (var childModel in addedChildren)
{
var child = Mapper.Map<ChildClass>(childModel);
parent.Children.Add(child);
if (Context.Entry(child).State == EntityState.Detached)
{
Context.Entry(child).State = EntityState.Added;
}
}
Entities.Update(parent);
await Context.SaveChangesAsync().ConfigureAwait(false);