gpt4 book ai didi

c# - Entity Framework AsNoTracking() 无限导航属性

转载 作者:行者123 更新时间:2023-12-05 03:09:24 25 4
gpt4 key购买 nike

我有这样的实现:

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 时我得到了 stackoverflow,所以我不太确定我是否正确使用了 AsNoTracking()(或者 AsNoTracking() 不会影响属性的无限嵌套,尽管我在某处读到过,但是仅跟踪 Context 中的更改以进行进一步的 CUD 操作?)

我的 Context 子类中也有这些:

this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;

虽然我的主要问题是无限的导航属性引用,但如果有人也能从问题的开头解释 AsNoTracking() 的正确用法,我将不胜感激(尽管,例如,它不会与问题有任何关系)。

谢谢。

最佳答案

不,在哪里调用 AsNoTracking() 并不重要。基本上它所做的就是设置 ObjectQuery.MergeOption (和一些其他属性)在内部 ObjectQuery 上,因此在实际查询执行之前在哪里执行此操作并不重要。

是的,所有 Include 实体也不会被上下文跟踪。

不,LazyLoadingEnabled = falseProxyCreationEnabled = falseAsNoTracking()不会解决所有你的无限递归问题,特别是如果你使用包含。寻找如何使用自动映射器正确映射此类递归实体,在 EF 端做任何事情都无济于事。

关于c# - Entity Framework AsNoTracking() 无限导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43077800/

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