Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework AsNoTracking应在何处应用?_Entity Framework - Fatal编程技术网

Entity framework AsNoTracking应在何处应用?

Entity framework AsNoTracking应在何处应用?,entity-framework,Entity Framework,我正在将查询从Linq迁移到Sql,再迁移到EF。为了使禁用跟踪更难忘记,我在Linq To Sql中编写了一个ConfigureForQuery包装函数,该函数只将ObjectTrackingEnabled设置为false。 我想继续使用类似的策略,但根据我目前收集到的信息,没有一个全球无跟踪设置。我想听听你对如何最好地解决我现有的问题的意见。一些代码: public class A { public int P1 { get; set; } public int P2 {

我正在将查询从Linq迁移到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;
}
公共A类{
公共int P1{get;set;}
公共int P2{get;set;}
}
公共B级{
公共int P3{get;set;}
公共int P4{get;set;}
}
公共类MyDbContext:DbContext{
公共IDbSet为{get;set;}
公共IDbSet{get;set;}
}
//场景1:返回T的IQueryable,其中IDbSet在DbContext中定义
公共IQueryable Get()
{
变量查询=
从数据库中的
在db.Bs中加入b
在a.P1上等于b.P3
其中b.P4>50
选择一个;
返回查询;
}
Q1:我在哪里以及如何申请AsNoTracking?
问题2:在这种情况下,我需要向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;
}
//场景2:返回T的IQueryable,其中未在DbContext中定义IDbSet
公共C类{
公共int P1{get;set;}
公共int P4{get;set;}
}
公共IQueryable Get()
{
变量查询=
从数据库中的
在db.Bs中加入b
在a.P1上等于b.P3
其中b.P4>50
选择C{P1=a.P1,P4=b.P4};
返回查询;
}
问题3:在这种情况下,我需要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();
}

看这个:@AlaaMasoud我编辑了这个问题。谢谢。记住使用System.Data.Entity添加;使AsNoTracking()扩展在IQueryable上可用
var tc = db.ChangeTracker.Entries().Count();