Entity Framework Удалить все при отправке - PullRequest
18 голосов
/ 09 января 2011

В LINQ to SQL я мог бы сделать:

context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));

Что эквивалентно этому для структуры сущностей?

Ответы [ 5 ]

24 голосов
/ 09 января 2011
foreach(var entity in context.User_Roles.Where(ur => ur.UserId == user.UserId))
{
  context.User_Roles.DeleteObject(entity);
}
context.SaveChanges();

Конечно, вы можете написать метод расширения, который бы инкапсулировал это.

Это будет примерно так:

public static void DeleteObjects<TEntity> (this ObjectSet<TEntity> set, IEnumerable<TEntity> data) where TEntity : class
{
  foreach(var entity in data)
    set.DeleteObject(entity);
}

Вызывается как:

context.User_Roles.DeleteObjects(context.User_Roles.Where(ur => ur.UserId == user.UserId))
context.SaveChanges();
5 голосов
/ 18 марта 2012

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

public static void DeleteAllObjects<TEntity>(this ObjectSet<TEntity> set, IEnumerable<TEntity> data) where TEntity : class {
    foreach(var entity in data.ToList()) //data.ToList() makes a copy of data for safe enumeration
        set.DeleteObject(entity);
}
2 голосов
/ 08 октября 2011
foreach(var entity in context.User_Roles.Where(ur => ur.UserId == user.UserId))
{
  context.User_Roles.DeleteObject(entity);
}
context.SaveChanges();

Конечно, это решение может работать. Но это самое неэффективное решение. Это решение будет генерировать одну команду SQL SQL для каждой записи (объекта). Представьте, что вы хотите удалить все данные до 2000 года. В базе данных более 1 000 000 записей. Если удалить эти объекты таким образом, на сервер будет отправлено более 1 000 000 SQL-команд, что является ненужной большой тратой. Что

0 голосов
/ 24 декабря 2012

использование EntityFramework.Extensions
1) Сначала установите EntityFramework.Extensions, используя NuGet

2) Вот код, похожий на DeleteAllOnSubmit () Linq2Sql:

using EntityFramework.Extensions;

....
public void DeleteAllUsers(User_Role user){
   context.User_Roles.Delete(ur => ur.UserId == user.UserId);
   context.SaveChanges();
}
...
0 голосов
/ 30 октября 2012

В Entity Framework нет эквивалента RemoveAll, поэтому вы можете загружать объекты в память и удалять их по одному, используя метод DeleteObject.

Вы можете использовать Linq: context.MyEntitie.RemoveAll (context.MyEntitie);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...