Подтвердить что ты не робот

Entity Framework Удалить все при отправке

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

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

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

4b9b3361

Ответ 1

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

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

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();

Ответ 3

foreach(var entity in context.User_Roles.Where(ur => ur.UserId == user.UserId))
{
  context.User_Roles.DeleteObject(entity);
}
context.SaveChanges();

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

Ответ 4

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

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

Ответ 5

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

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

using EntityFramework.Extensions;

....
public void DeleteAllUsers(User_Role user){
   context.User_Roles.Delete(ur => ur.UserId == user.UserId);
   context.SaveChanges();
}
...