В LINQ to SQL я мог бы сделать:
context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));
Что эквивалентно этому для инфраструктуры сущностей?
В LINQ to SQL я мог бы сделать:
context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));
Что эквивалентно этому для инфраструктуры сущностей?
@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);
}
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();
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, это ненужные большие отходы. Что
В Entity Framework нет эквивалента RemoveAll, поэтому вы можете загружать объекты в память и удалять их один за другим с помощью метода DeleteObject.
Вы можете использовать Linq: context.MyEntitie.RemoveAll(context.MyEntitie);
использовать 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();
}
...