gpt4 book ai didi

entity-framework - 应该在哪里应用 AsNoTracking?

转载 作者:行者123 更新时间:2023-12-04 13:49:19 28 4
gpt4 key购买 nike

我正在将查询从 Linq-to-Sql 迁移到 EF。为了使禁用跟踪更难忘记,在 Linq-To-Sql 中,我编写了一个 ConfigureForQuery 包装函数,它只是将 ObjectTrackingEnabled 设置为 false。
我想继续使用类似的策略,但根据我目前收集到的信息,“无跟踪”的全局设置不可用。我希望您对如何最好地解决我现有的查询提出意见。一些代码:

public class A {
public int P1 { get; set; }
public int P2 { get; set; }
}
public class B {
public int P3 { get; set; }
public int P4 { get; set; }
}
public class MyDbContext : DbContext {
public IDbSet<A> As { get; set; }
public IDbSet<B> Bs { get; set; }
}

// scenario 1: returning IQueryable of T where IDbSet<T> is defined in a DbContext
public IQueryable<A> Get()
{
var query =
from a in db.As
join b in db.Bs
on a.P1 equals b.P3
where b.P4 > 50
select a;
return query;
}

Q1:我在哪里以及如何应用 AsNoTracking?
Q2:在这种情况下,我是否需要将 AsNoTracking 应用到 Bs?
// scenario 2: returning IQueryable of T where IDbSet<T> is NOT defined in a DbContext
public class C {
public int P1 { get; set; }
public int P4 { get; set; }
}
public IQueryable<C> Get()
{
var query =
from a in db.As
join b in db.Bs
on a.P1 equals b.P3
where b.P4 > 50
select C { P1 = a.P1, P4 = b.P4};
return query;
}

Q3:在这种情况下我需要 AsNoTracking 吗?

谢谢你的帮助。

最佳答案

在第一种情况下,您可以简单地申请 AsNoTracking查询的结果:

public IQueryable<A> Get() {
var query =
from a in db.As
join b in db.Bs
on a.P1 equals b.P3
where b.P4 > 50
select a;

return query.AsNoTracking();
}

在第二种情况下,由于您要返回不在 DbContext 中的内容,因此无论如何都不会对其进行跟踪,因此您无需执行任何操作。

您可以在查询后检查更改跟踪器以查看正在跟踪的内容和未跟踪的内容。
var tc = db.ChangeTracker.Entries().Count();

关于entity-framework - 应该在哪里应用 AsNoTracking?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26496952/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com