Entity Framework: удалить все сущности из коллекции

Я использую Identity в приложении ASP.NET MVC.

Моя модель идентичности (вовлеченная часть):

public class ApplicationUser : IdentityUser
{
    public virtual ICollection<Group> Groups { get; set; }
}

public class Group
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<ApplicationUser> ApplicationUsers { get; set; 
}

У меня есть такой пользователь:

    ApplicationUser signedUser = UserManager.FindById(model.Id);

Теперь я хочу просто удалить все Group этого подписанного пользователя. Я пробовал цикл foreach, но, конечно, по мере изменения коллекции он не работает. У меня нет метода RemoveAll() для signedUser.Groups.

Как этого добиться?

Спасибо

Предполагая, что в группе может быть несколько пользователей, и пользователи могут принадлежать к нескольким группам (отношение «многие ко многим»), у вас, вероятно, есть таблица ссылок? Если это так, и если вы хотите удалить определенного пользователя из всех групп, к которым он принадлежит, вы должны удалить записи таблицы ссылок, которые относятся к этому идентификатору пользователя.

Rno 21.10.2018 23:10

Да, у меня есть таблица ссылок, но поскольку я использую Identity, у меня нет сущности для этой таблицы ссылок ...

Manta 21.10.2018 23:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны попросить ваш unitOfWork выполнить эту работу за вас:

unitOfWork.Groups.RemoveRange(signedUser.Groups);

или если вы предпочитаете работать напрямую с dbset:

foreach(var group in signedUser.Groups)
{
   db.Entry(group).State = EntityState.Deleted;
}
db.SaveChanges(); //After all the customer is deleted, Commit.

Я не хочу удалять группу, а группу ApplicationUser, и, как уже упоминалось, цикл foreach не может быть выполнен, поскольку коллекция изменяется при удалении элемента.

Manta 21.10.2018 23:21

Тот факт, что установщик этого свойства EntityEntry 'State' является общедоступным, всегда удивлял меня - я могу только предположить, что дизайнеры EF считают, что есть законные и безопасные причины для его непосредственного изменения, хотя из документации не ясно, что (они намекают, что это может быть, если вы хотите что-то удалить без затрат на загрузку).

Dylan Nicholson 21.10.2018 23:40

Думаю, я не совсем понимаю, что вы пытаетесь сделать. что вы имеете в виду, говоря «Я хочу удалить не группу, а группу ApplicationUser». Но не беспокойтесь о цикле foreach, который будет работать.

roozbeh S 21.10.2018 23:43
Ответ принят как подходящий

Ладно, я понял. Дело в том, что это виртуальное свойство, а на самом деле просто отношение.

Итак, чтобы удалить это отношение, мне пришлось использовать:

signedUser.Groups.Clear();

Спасибо за вашу помощь.

Другие вопросы по теме