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

本文关键字:数据库 访问 框架 DeleteObject 实体 | 更新日期: 2023-09-27 18:20:26

这个实体框架调用是否真的对数据库进行了两次访问?

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

我突然想到,DeleteObject可能会强制第一次访问以获得结果,然后,有了要处理的对象,就会执行delete函数。

如果是这样的话,我该如何避免第二次旅行?如何在实体框架中用一次数据库访问来执行按查询删除?

谢谢!

编辑

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

    var result = from p in entities.people where p.cityid == 6 select p;
    foreach (var r in result)
    {
        entities.DeleteObject(r);
    }

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

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

你可以这样做:

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

这肯定是一次数据库之旅,而且尽可能有效。

编辑:另外,看看这里,他们提出了同样的解决方案。为了回答这个问题,这是使用实体框架从数据库中删除未被主键引用的实体的唯一方法,而无需获取这些实体(也无需编写本答案中建议的一些辅助扩展方法)。

直接删除:

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

如果你想亲眼看到它,启动一个探查器。

编辑:

这将允许你使用林克,但这不会是一次旅行。

var peopleToDelete = entities.people.Where(p => p.id == 6);
foreach (var people in peopleToDelete )
    entities.people.DeleteObject(people );
entities.SaveChanges();

在EF中,没有简单的方法可以开箱即用,这确实是一个很大的烦恼(只要人们不想使用直接SQL,我个人不想)。另一个海报链接到一个答案,该答案又链接到本文,本文描述了一种使用ToTraceString制作自己的函数的方法。