невозможно удалить объект, имеющий отношение многие ко многим - PullRequest
2 голосов
/ 22 февраля 2011

это мои упрощенные сущности:

public class User : Entity
{
    public virtual ICollection<Role> Roles { get; set; }
}

public class Role : Entity
{
    public virtual ICollection<User> Users { get; set; }
}

var user = dbContext.Set<User>().Find(id);
dbContext.Set<User>().Remove(user);
dbContext.SaveChanges(); // here i get error (can't delete because it's the     
//referenced by  join table roleUsers

проблема в том, что таблица соединений ссылается на таблицу пользователей, а ef не удаляет записи из таблицы соединений перед удалением пользователя

Я попытался написать контрольные примеры и заметил, что:

если использовать тот же контекст для добавления пользователя с ролями, сохранения изменений, удаления и повторного сохранения изменений, это работает

но если я использую 2 разных контекста, один для вставки, а другой для удаления, я получаю эту ошибку

Ответы [ 3 ]

2 голосов
/ 22 февраля 2011

Прежде чем вы сможете удалить пользователя, вы должны сначала очистить коллекцию ролей (роли пользователя должны быть загружены).

1 голос
/ 31 октября 2011

Если вы хотите просто получить это удаление, просто сделайте то, что говорит ошибка.

как часть вашего метода DELETE, вы должны сделать это по порядку.

1) Получить пользователя, включая связанные с ним роли, вы можете использовать User.Include (r => r.roles)

2) перебрать и удалить роли для данного пользователя (убедитесь, что вы используете toList () при выполнении этого цикла)

3) Удалить пользователя

4) сохранения

0 голосов
/ 05 ноября 2014
user.Roles
    .ToList()
    .ForEach(role => user.Roles.remove(role));

context.Users.remove(user);
context.SaveChanges();
...