在LINQ to SQL中,我可以这样做:
context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));
与实体框架相当的是什么?
答案 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
2)这是类似于Linq2Sql的DeleteAllOnSubmit()的代码:
using EntityFramework.Extensions;
....
public void DeleteAllUsers(User_Role user){
context.User_Roles.Delete(ur => ur.UserId == user.UserId);
context.SaveChanges();
}
...