EF DbContext。如何避免缓存?

2023-12-06

花了很多时间,但仍然无法理解如何避免在DbContext中进行缓存。

我在下面附上了一些简单案例的实体模型来演示我的意思。

问题在于 dbcontext 缓存结果。例如,我有下一个用于从数据库查询数据的代码:

using (TestContext ctx = new TestContext())
{
   var res = (from b in ctx.Buildings.Where(x => x.ID == 1)
             select new
             {
                b,
                flats = from f in b.Flats
                        select new
                        {
                           f,
                           people = from p in f.People
                           where p.Archived == false
                           select p
                        }
             }).AsEnumerable().Select(x => x.b).Single();

}

在这种情况下,一切都很好:我得到了我想要的(只有 Archived == false 的人)。

但是,如果我在其后添加另一个查询,例如,查询有人将“已存档”标志设置为 true 的建筑物,我会遇到接下来的事情,我真的无法理解:

  1. 我之前的结果是res,将通过数据添加(有 也将添加 Archived == true 的人员)
  2. 新结果将绝对包含所有 Person,无论 Archived 等于什么

该查询的代码如下:

using (TestContext ctx = new TestContext())
{
   var res = (from b in ctx.Buildings.Where(x => x.ID == 1)
             select new
             {
                b,
                flats = from f in b.Flats
                        select new
                        {
                           f,
                           people = from p in f.People
                           where p.Archived == false
                           select p
                        }
             }).AsEnumerable().Select(x => x.b).Single();


    var newResult = (from b in ctx.Buildings.Where(x => x.ID == 1)
              select new
              {
                  b,
                  flats = from f in b.Flats
                          select new
                          {
                             f,
                             people = from p in f.People
                             where p.Archived == true
                             select p
                           }
               }).AsEnumerable().Select(x => x.b).Single();
            }

顺便说一下,我设置了启用延迟加载在 TestContext 的构造函数中设置为 false。

有人知道如何解决这个问题吗?我怎样才能在我的查询中得到我在 linq to 实体中真正写的内容?

附: @Ladislav 你可以帮忙吗?

Entity Model


您可以使用不追踪您的查询的方法。

var res = (from b in ctx.Buildings.Where(x => x.ID == 1)
         select new
         {
            b,
            flats = from f in b.Flats
                    select new
                    {
                       f,
                       people = from p in f.People
                       where p.Archived == false
                       select p
                    }
         }).AsNoTracking().AsEnumerabe().Select(x => x.b).Single();

我还想指出的是,你的AsEnumerable可能弊大于利。如果将其删除,则Select(x => x.b)将被翻译为 SQL。事实上,你正在选择一切,然后扔掉一切,除了x.b在记忆中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF DbContext。如何避免缓存? 的相关文章

随机推荐