环境
我在框架 4.0 上使用实体框架 5。(这意味着我实际上使用的是 EF 4.4)。作为实体,我使用 STE(自我跟踪实体),因为我在 N 层应用程序中工作。我们使用数据库驱动的方法,因为 EF 是在游戏后期引入的。
语境
我有 2 个实体,它们都具有彼此的导航属性。(EntityA 具有到 EntityB 的导航属性,而 EntityB 具有到 EntityA 的导航属性)。关系是“EntityA > 一对多 > EntityB”。当我想通过 LINQ 表达式加载子实体时,我需要使用 INCLUDE (STE => Eager Loading),因为我将通过几层传递所有数据。
编码
这是我调用 EntityA 及其 EntityB 子级的代码。
using (var ctx = new MyEntities())
{
var result = (from s in ctx.EntityA.Include("EntityB")
where s.Id = 11111
orderby s.TimeUpdated descending
select s)
.Take(10)
.ToList();
return result;
}
错误
System.StackOverflowException {无法评估表达式,因为当前线程处于堆栈溢出状态。}
删除“包含”时没有错误。我想原因很简单。我想用子记录EntityB加载EntityA,EntityB记录每次都想加载它的父EntityA,而EntityA……我想每个人都明白这里的无限循环。
我的解决方案或替代方案
- 我转到我的 EDMX 文件并删除 EntityB 中 EntityA 的导航属性。如果我现在想加载有关 EntityA 的数据,而我有一个 EntityB 可供使用。我需要做一个单独的数据库请求,并且我有 2 个不同的对象必须通过我的层传递。
- 避免使用包含,单独加载 EntityA 并将其推送到我的 EntityB 的 Navigation 属性中,该属性引用我的 EntityA。
问题
在我的情况下是否有更好的选择或方法来解决这个问题?我是否应该继续我提出的替代方案之一?因为我希望有一个更好、更清洁的解决方案。
谢谢你的时间
伊恩