У меня есть родитель с несколькими детьми.У родительских детей есть свойство типа 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);