C# 如何使用Find()方法[EF Core]加载TEntity的另一个导航属性的导航属性
我创建了一个C# 如何使用Find()方法[EF Core]加载TEntity的另一个导航属性的导航属性,c#,entity-framework-core,repository-pattern,C#,Entity Framework Core,Repository Pattern,我创建了一个通用存储库使用实体框架核心目标.Net 5我创建了一个方法,该方法将接收对象的主键值,它(方法)应选择对象并加载接收到的相关实体 我尝试: public virtual TEntity GetById( object pkValue , params Expression<Func<TEntity , object>>[] relatedEntitiesToBeLoaded ) { // Change DbContex
通用存储库
使用实体框架核心
目标.Net 5
我创建了一个方法,该方法将接收对象的主键
值,它(方法)应选择对象并加载接收到的相关实体
我尝试:
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 );
_groupProfSubjectRepository.GetById( id, x => x.Group , x => x.Prof , x => x.SchoolSubject, x=>x.SchoolSubject.FormationYear );
但是,当我尝试加载另一个tenty的导航属性时,如下面的示例所示:
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 );
_groupProfSubjectRepository.GetById( id, x => x.Group , x => x.Prof , x => x.SchoolSubject, x=>x.SchoolSubject.FormationYear );
我收到这个错误:
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 );
_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”)
要显示代码详细信息,我的存储库是一个searated项目,您可以查看代码
请提供任何帮助以解决此问题?根据此文档
嵌套对象(复合体类型)不受支持。
但它与<代码>()> >方法应考虑从“代码>查找”/代码>方法和显式加载到“代码> > FrestRealSuth。另请参见,关于显式加载,请参见和,但是它需要处理传递的表达式,提取和分离“引用”部分,以便能够链接引用
调用,直到达到所需级别。请您提供一个示例作为回答,我真的很感激你兄弟因为这是你第二次帮忙me@IvanStoev请您为我提供一个示例作为最后一个示例x=>x.SchoolSubject.FormationYear
的答案,您需要以某种方式执行Context.Entry(resultObject).Reference(x=>x.SchoolSubject.Query()。Include(y=>y.FormationYear).Load()代码>,但如何通过传递表达式的方式准确地实现这一点很困难(此时无法编写代码,但需要使用表达式
s)