Entity Framework AsNoTracking() 无限导航 属性
Entity Framework AsNoTracking() Infinite Navigation Property
我有这样的实现:
var query = this.DbContext.Set<T>();
if (includeProperties != null && includeProperties.Any())
{
foreach (var includeProperty in includeProperties)
{
if (!String.IsNullOrEmpty(includeProperty))
{
query = query.Include(includeProperty);
}
}
}
return await query.Where<T>(predicate).ToListAsync();
我想进行此查询 AsNoTracking()
我想知道在哪里打电话很重要 AsNoTracking()
?
如果我把它放在这里有什么不同吗:
var query = this.DbContext.Set<T>().AsNoTracking();
或此处:
return await query.Where<T>(predicate).AsNoTracking().ToListAsync();
两者执行查询 .AsNoTracking()
的方式是否相同?
此外,如果 .Include()
也受到这些 .AsNoTracking()
中任何一个的影响,我也很感兴趣,或者我是否必须像这样添加额外的 .AsNoTracking()
:
query = query.Include(includeProperty).AsNoTracking();
我在使用 .Include()
时遇到了问题,因为我得到了无限递归导航属性,而在使用 Automapper
时我得到了 Whosebug
,所以我不太确定我是否正确使用 AsNoTracking()
(或 AsNoTracking()
不会影响属性的无限嵌套,尽管我在某处读到过,但只跟踪 Context
的变化以进行进一步的 CUD 操作?)
我的 Context 子类中也有这些:
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
虽然我的主要问题是无限导航 属性 引用,但如果有人也能从问题的开头解释 AsNoTracking()
的正确用法,我将不胜感激(尽管,例如,它不与问题无关)。
谢谢。
不,在哪里调用并不重要AsNoTracking()
。基本上它所做的就是在内部 ObjectQuery
上设置 ObjectQuery.MergeOption(和一些其他属性),所以在实际查询执行之前在哪里做并不重要。
是的,所有 Include
ed 实体也不会被上下文跟踪。
不,LazyLoadingEnabled = false
、ProxyCreationEnabled = false
和AsNoTracking()
将不会解决所有你的无限递归问题,尤其是在使用包含时。寻找如何使用自动映射器正确映射此类递归实体,在 EF 端做任何事情都无济于事。
我有这样的实现:
var query = this.DbContext.Set<T>();
if (includeProperties != null && includeProperties.Any())
{
foreach (var includeProperty in includeProperties)
{
if (!String.IsNullOrEmpty(includeProperty))
{
query = query.Include(includeProperty);
}
}
}
return await query.Where<T>(predicate).ToListAsync();
我想进行此查询 AsNoTracking()
我想知道在哪里打电话很重要 AsNoTracking()
?
如果我把它放在这里有什么不同吗:
var query = this.DbContext.Set<T>().AsNoTracking();
或此处:
return await query.Where<T>(predicate).AsNoTracking().ToListAsync();
两者执行查询 .AsNoTracking()
的方式是否相同?
此外,如果 .Include()
也受到这些 .AsNoTracking()
中任何一个的影响,我也很感兴趣,或者我是否必须像这样添加额外的 .AsNoTracking()
:
query = query.Include(includeProperty).AsNoTracking();
我在使用 .Include()
时遇到了问题,因为我得到了无限递归导航属性,而在使用 Automapper
时我得到了 Whosebug
,所以我不太确定我是否正确使用 AsNoTracking()
(或 AsNoTracking()
不会影响属性的无限嵌套,尽管我在某处读到过,但只跟踪 Context
的变化以进行进一步的 CUD 操作?)
我的 Context 子类中也有这些:
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
虽然我的主要问题是无限导航 属性 引用,但如果有人也能从问题的开头解释 AsNoTracking()
的正确用法,我将不胜感激(尽管,例如,它不与问题无关)。
谢谢。
不,在哪里调用并不重要AsNoTracking()
。基本上它所做的就是在内部 ObjectQuery
上设置 ObjectQuery.MergeOption(和一些其他属性),所以在实际查询执行之前在哪里做并不重要。
是的,所有 Include
ed 实体也不会被上下文跟踪。
不,LazyLoadingEnabled = false
、ProxyCreationEnabled = false
和AsNoTracking()
将不会解决所有你的无限递归问题,尤其是在使用包含时。寻找如何使用自动映射器正确映射此类递归实体,在 EF 端做任何事情都无济于事。