Очистка свойства связанной таблицы с помощью фильтра - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица с именем Parent, которая имеет отношение «многие ко многим» с таблицей с именем Child. В модели EF Parent - это сущность, которая имеет свойство с именем Child типа ICollection<Child>.

Я могу в программе сделать это, чтобы удалить все связанные элементы Child, а затем повторно заполнить его:

Parent entity = context.Parent.FirstOrDefault(someCondition);
entity.Child.Clear();  // remove all related child elements (in database, only data in the associated table is removed)
entity.Child.Add(newChildEntity)
context.SaveChanges();

Однако что, если мне нужно удалить элементы Child с помощью условия?

Я пробовал:

entity.Child.Where(otherCondition).Clear();

Но поскольку Where метод возвращает IEnumerable<Child> Я не могу использовать метод Clear ().

Другая попытка заключалась в приведении к ICollection<Child> перед вызовом метода Clear, но возникло исключение, сообщающее, что приведение невозможно .

Любая помощь, пожалуйста?

Возможно, я мог бы получить entity.Child.Where(otherCondition), а затем использовать ForEach l oop - Remove для всех элементов, однако, помимо обеспечения очень плохой производительности, Я думаю, что таким образом удаляется и элемент Child, а не только данные отношения.

Jaime

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Если ваш dbContext не похож на этот, я думаю, вам следует реструктурировать свою базу данных для повышения эффективности.

public MyDbContext
{
   //Details obscured for brevity
   public DbSet<Parent> Parents {get; set; }
   public DbSet<Child> Children {get; set;}
}
//Your models
public class Parent
{
   public string Id {get; set;}
   //......
}
public class Child
{
   public string Id {get; set;}
   //If a child can have just one parent
   public string ParentId {get; set;}
   //......

   public virtual Parent Parent {get; set;}
}
//Another table if a child can have more than one parent
public class ParentChild
{
   public string ParentId {get; set;}
   public string ChildId {get; set;}
   //......
   public virtual ICollection<Parent> Parents {get; set;}
   public virtual ICollection<Child> Children {get; set;}
}

Тогда вы можете

context.DbSet<Child>().Remove(x => x.ParentId == myParentId);

OR

context.DbSet<ParentChildren>().Remove(x => x.ParentId == myParentId);
0 голосов
/ 26 мая 2020

Метод Where возвращает IEnumerable<Child>, и вы можете преобразовать его в список.

Вы пробовали преобразовать IEnumerable в список и очистить список? вот так:

List<Child> mylist= enumerable.ToList(); 
mylist.Clear();
...