EF как обновить уникальный индекс с условием - PullRequest
0 голосов
/ 08 октября 2018

У меня есть родитель с несколькими детьми.У родительских детей есть свойство типа boolean.Только один ребенок может иметь свойство true.Я создал индекс EF следующим образом:

migrationBuilder.CreateIndex(
   name: "....",
   table: "ChildTable",
   columns: new[] { "ParentId", "Property" },
   unique: true,
   filter: "[Property] = 1");

Все работает до тех пор, пока вы не попытаетесь обновить записи.

Когда у родителя 2 дочерних элемента, а у второго дочернего элемента свойство 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);
...