实体框架在提交时删除全部

时间:2011-01-09 19:30:36

标签: entity-framework

在LINQ to SQL中,我可以这样做:

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

与实体框架相当的是什么?

5 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:5)

@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 :(得分:2)

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

当然,这个解决方案可以工作。但是,这是效率最低的解决方案。 此解决方案将为每个记录(实体)生成一个删除SQL命令。 要在2000年之前删除所有数据的映像。数据库中有超过1,000,000条记录。如果以这种方式删除这些对象,将超过1,000,000条SQL命令发送到服务器,这是不必要的大浪费。 什么

答案 3 :(得分:0)

Entity Framework中没有RemoveAll等效项,因此您可以在内存中加载实体并使用DeleteObject方法逐个删除它们。

你可以使用Linq:context.MyEntitie.RemoveAll(context.MyEntitie);

答案 4 :(得分:0)

使用EntityFramework.Extensions
1)首先使用NuGet

安装EntityFramework.Extensions

2)这是类似于Linq2Sql的DeleteAllOnSubmit()的代码:

using EntityFramework.Extensions;

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