EF DbContext. How to avoid caching?

后端 未结 2 1172
清歌不尽
清歌不尽 2021-01-06 04:25

Spent a lot of time, but still cann\'t understand how to avoid caching in DbContext.

I attached below entity model of some easy case to demonstrate what I mean.

相关标签:
2条回答
  • 2021-01-06 04:52

    You can use the AsNoTracking method on your query.

    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();
    

    I also want to note that your AsEnumerable is probably doing more harm than good. If you remove it, the Select(x => x.b) will be translated to SQL. As is, you are selecting everything, then throwing away everything but x.b in memory.

    0 讨论(0)
  • 2021-01-06 05:12

    have you tried something like:

    ctx.Persons.Where(x => x.Flat.Building.Id == 1 && x.Archived == false);
    

    ===== EDIT =====

    In this case I think you approach is, imho, really hazardous. Indeed you works on the data loaded by EF to interpret your query rather than on data resulting of the interpretation of your query. If one day EF changes is loading policy (for example with a predictive pre-loading) your approach will "send you in then wall".

    For your goal, you will have to eager load the data you need to build your "filterd" entity. That is select the building, then foreach Flat select the non archived persons.

    Another solution is to use too separate contexts in an "UnitOfWork" like design.

    0 讨论(0)
提交回复
热议问题