【问题标题】:How to load navigation properties of another navigation properties of an TEntity with Find() Method [EF Core]如何使用 Find() 方法加载 TEntity 的另一个导航属性的导航属性 [EF Core]
【发布时间】:2021-05-04 09:41:37
【问题描述】:

我创建了一个generic repositoryEntity framework core 一起工作,目标.Net 5 我创建了一个方法,它将接收一个对象的primary key 值,它(方法)应该选择对象并加载收到的相关实体

我试试:

 public virtual TEntity GetById( object pkValue , params Expression<Func<TEntity , object>>[] relatedEntitiesToBeLoaded )
        {
            // Change DbContext tracking behavior to track all entities
            Context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll;

            // Get one object using primary key
            var resultObject = Context.Set<TEntity>().Find( pkValue );

            // Load all selected objects from selected entities
            foreach ( var entityToLoad in relatedEntitiesToBeLoaded )
            {
                Context.Entry( resultObject ).Reference( entityToLoad ).Load();
            }

            return resultObject;
        }

当我像示例一样使用此方法时,它可以正常工作:

_groupProfSubjectRepository.GetById( id, x => x.Group , x => x.Prof , x => x.SchoolSubject );

但是当我尝试加载 TEntity 的另一个导航属性的导航属性时,如下例所示:

 _groupProfSubjectRepository.GetById( id, x => x.Group , x => x.Prof , x => x.SchoolSubject, x=>x.SchoolSubject.FormationYear );

我收到此错误:

ArgumentException:表达式'x => x.SchoolSubject.FormationYear' 不是有效的成员访问表达式。表达式应该 表示一个简单的属性或字段访问:'t => t.MyProperty'。 (参数'memberAccessExpression')

要显示代码详细信息,我的存储库是一个免费和开源的密封项目,您可以查看代码here

请帮忙解决这个问题?

【问题讨论】:

  • 你真的应该考虑从Find 方法和显式加载切换到FirstOrDefault 的急切加载。见stackoverflow.com/questions/40360512/…,也见stackoverflow.com/questions/39434878/…
  • 至于显式加载,参见stackoverflow.com/questions/54675380/…stackoverflow.com/questions/63882266/…,但是它需要使用传递的表达式并提取和分离“引用”部分以便能够链接Reference 调用直到达到所需的水平。
  • 请你给我一个例子作为答案,我真的很感谢你兄弟,因为这是你第二次帮助我
  • @IvanStoev 请你给我一个例子作为答案兄弟
  • 对于最后一个示例x=&gt;x.SchoolSubject.FormationYear,您需要以某种方式执行Context.Entry(resultObject ).Reference(x =&gt; x.SchoolSubject).Query().Include(y =&gt; y.FormationYear).Load();,但是如何通过传递表达式的方式准确地做到这一点很困难(目前无法编写代码,但它需要使用Expressions)

标签: c# entity-framework-core repository-pattern


【解决方案1】:

根据本文档https://github.com/dotnet/efcore/issues/1585

不支持嵌套对象(复杂类型)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2018-10-22
    相关资源
    最近更新 更多