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人的建筑,我接下来的事情就,我真正明白水湿:
这个查询的代码是下一个:
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可能对你有帮助吗?

您可以在查询中使用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在记忆中.
| 归档时间: |
|
| 查看次数: |
6213 次 |
| 最近记录: |