实体框架 - 在DeleteObject上访问数据库的次数

时间:2012-01-15 21:59:58

标签: c# mysql linq entity-framework

这个实体框架调用实际上是两次访问数据库吗?

    var result = from p in entities.people where p.id == 6 select p;
    entities.DeleteObject(result);

让我感到震惊的是,也许DeleteObject会强制第一次获取结果,然后让对象使用,执行删除功能。

如果是这种情况,我该如何避免第二次旅行?如何通过单个数据库跳转在实体框架中执行逐个查询?

谢谢!

修改

我的原始示例有误导性,因为它是主键查询。我想真正的问题是,是否有一种方法可以使用可以从IQueryable中删除项目的单行程功能。例如:

    var result = from p in entities.people where p.cityid == 6 select p;

    foreach (var r in result)
    {
        entities.DeleteObject(r);
    }

(请注意,查询是外键,因此可能会有多个结果。)

2 个答案:

答案 0 :(得分:1)

直接删除:

var people = new people() { id = 6 };
entities.people.Attach(people);
entities.people.Remove(people);
entities.SaveChanges();

如果您想亲自查看,fire up a profiler

编辑:

这将允许您使用Linq,但它不会是一次旅行。

var peopleToDelete = entities.people.Where(p => p.id == 6);

foreach (var people in peopleToDelete )
    entities.people.DeleteObject(people );

entities.SaveChanges();

在EF中没有简单的方法可以做到这一点,确实是一个很大的烦恼(只要一个人不想使用直接SQL,我个人不这样做)。其中一个海报链接到一个答案,该答案又链接到this article,其中使用ToTraceString描述了为此创建自己的函数的方法。

答案 1 :(得分:1)

你可以这样做:

  entities.ExecuteStoreCommand("DELETE FROM people WHERE people.cityid={0}", 6);

这是一次确保数据库的访问,并且尽可能有效。

编辑: 另外,看看here,他们建议采用相同的解决方案。回答这个问题,这是使用实体框架从数据库中删除未被主键引用的实体的唯一方法,而无需获取这些实体(并且没有编写一些辅助扩展方法,如this中建议的那样)