AsNoTracking 应该应用在哪里?

Can*_*hiu 4 entity-framework

我正在将查询从 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;
}
Run Code Online (Sandbox Code Playgroud)

Q1:在哪里以及如何应用 AsNoTracking?
Q2:这种情况下,Bs需要应用AsNoTracking吗?

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

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

感谢您的帮助。

Ala*_*oud 5

在第一种情况下,您可以简单地应用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();
}
Run Code Online (Sandbox Code Playgroud)

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

您可以在查询后检查更改跟踪器,以查看正在跟踪的内容和未跟踪的内容。

var tc = db.ChangeTracker.Entries().Count();
Run Code Online (Sandbox Code Playgroud)