【发布时间】:2021-05-04 09:41:37
【问题描述】:
我创建了一个generic repository 与Entity 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=>x.SchoolSubject.FormationYear,您需要以某种方式执行Context.Entry(resultObject ).Reference(x => x.SchoolSubject).Query().Include(y => y.FormationYear).Load();,但是如何通过传递表达式的方式准确地做到这一点很困难(目前无法编写代码,但它需要使用Expressions)
标签: c# entity-framework-core repository-pattern