【发布时间】:2011-01-09 19:30:36
【问题描述】:
在 LINQ to SQL 中,我可以这样做:
context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));
实体框架的等效物是什么?
【问题讨论】:
标签: entity-framework
在 LINQ to SQL 中,我可以这样做:
context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));
实体框架的等效物是什么?
【问题讨论】:
标签: entity-framework
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();
【讨论】:
Can 't create extesion method for LINQ to Enitities link DeleteAllOnSubmit() in LINQ to SQL 是您遇到该问题时会收到的错误消息。
DeleteObjects 需要是静态的,TEntity 需要被约束到一个类:public static void DeleteObjects<TEntity>(this ObjectSet<TEntity> set, IEnumerable<TEntity> data) where TEntity : class
@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);
}
【讨论】:
for (int i = data.Count() - 1; i >= 0; i--) set.DeleteObject(data.ElementAt(i));
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 命令,这是不必要的大浪费。 什么
【讨论】:
Entity Framework 中没有 RemoveAll 等价物,因此您可以在内存中加载实体并使用 DeleteObject 方法将它们一一删除。
你可以使用 Linq : context.MyEntitie.RemoveAll(context.MyEntitie);
【讨论】:
使用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();
}
...
【讨论】: