EF DbContext.如何避免缓存?

Dan*_*Man 4 entity-framework dbcontext

花了很多时间,但仍然无法理解如何避免在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();

}
Run Code Online (Sandbox Code Playgroud)

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

但是,如果我加入后,另一个查询,例如,查询有已归档的标志设置为true人的建筑,我接下来的事情就,我真正明白水湿:

  1. 我以前的结果,即res,将由数据添加(将添加已存档的人员==也为真)
  2. 无论Archived等于什么,新结果都将包含绝对所有Person

这个查询的代码是下一个:

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();
            }
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我在TestContext的构造函数中将LazyLoadingEnabled设置为false.

有人知道如何解决这个问题吗?如何在我的查询中有我真正在linq中写入实体的内容?

PS @Ladislav可能对你有帮助吗?

实体模型

cad*_*ll0 9

您可以在查询中使用AsNoTracking方法.

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();
Run Code Online (Sandbox Code Playgroud)

我还想指出,你的AsEnumerable弊大于利.如果删除它,Select(x => x.b)将转换为SQL.你正在选择所有东西,然后把所有东西扔掉,但是x.b在记忆中.