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

标签 c# entity-framework lazy-loading dbcontext navigation-properties

我有这样的实现:

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/

相关文章:

c# - 统一: Saving/Loading Sprites as Json

c# - 可空泛型引用类型

c# - 无法使用c#运行命令

entity-framework - 如何从解决方案资源管理器中选择特定的实体图

java - 使用 FieldInterceptor 问题的 Hibernate OneToOne 延迟加载

entity-framework - 避免使用lazyloader属性

c# - 确定基于 0 的数组的模数

c# - 无法更新数据库,因为实体无法删除约束

c# - 当我在模型类中使用导航属性时出现空引用异常

javascript - 使用许多 <li> 延迟加载长 <ul> 的最简单方法