EF codefirst удалить все дочерние объекты в сценарии много-много? - PullRequest
3 голосов
/ 11 апреля 2011

Как удалить все дочерние объекты в сценарии "многие ко многим"? Например, я хотел бы удалить все roles, принадлежащие user.

Сначала я использую код EF.

Ответы [ 5 ]

7 голосов
/ 12 апреля 2011

Вы действительно хотите удалить роли, принадлежащие пользователю?Это означает, что записи ролей будут удалены, что, скорее всего, приведет к исключению, потому что в сценариях «многие ко многим» роли будут использоваться другими пользователями.

Если вы все настроите правильно, это должно просто удалить отношения между пользователем иего роли:

var user = context.Users.Include("Roles").Single(u => u.Id == id);
user.Roles.Clear();
context.SaveChanges();
6 голосов
/ 11 апреля 2011

Сначала вы должны выбрать все роли и затем удалите из коллекции ролей экземпляра пользователя. Сохранить

var usersRoles = user.Roles.ToList();

usersRoles.ForEach(role => user.Roles.Remove(role));

context.SaveChanges();

// Add new roles to the user

PS. код может быть не точным, но эту логику вам следует использовать для достижения этой цели

1 голос
/ 13 апреля 2011

Для многих-многих отношений по умолчанию в EF Code First используется каскадное удаление, если вы разрешаете EF создавать базу данных.Поэтому, если вы удалите пользователя, роли должны исчезнуть автоматически.Если у вас есть существующая база данных и вы можете настроить ее для каскадного удаления, это, вероятно, будет самым простым и эффективным решением.

0 голосов
/ 02 декабря 2013

В SaveChanges моего DbContext

var trackPublication = ChangeTracker.Entries<Publication>();
var dbEntityEntriesPublication = trackPublication as IList<DbEntityEntry<Publication>> ?? trackPublication.ToList();
foreach (var item in dbEntityEntriesPublication.Where(t => t.State == EntityState.Deleted))
        {
            item.State = EntityState.Unchanged;
            item.Collection(m=>m.Groups).Load();
            item.Entity.Groups.Clear();
            item.State = EntityState.Deleted;
        }
0 голосов
/ 11 мая 2011

Ключ заключается в том, чтобы преобразовать набор сущностей для удаления в список, чтобы вы могли выполнять итерации и влиять на них.

var usersRoles = user.Roles.ToList();

foreach (var role in usersRoles )
   Context.DeleteObject(role );
...