EF如何根据条件更新唯一索引

时间:2018-10-08 11:03:51

标签: entity-framework-core sql-server-2016

我的父母有多个孩子。父级子级具有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);

0 个答案:

没有答案