环境
我正在使用基于Framework 4.0的Entity Framework 5。(这意味着我实际上使用的是EF 4.4)。 作为实体,我使用STE(自跟踪实体),因为我正在开发一个N-Tier应用程序。 我们采用数据库驱动方法,因为EF是在后期引入的。
背景
我有两个实体,它们都有彼此的导航属性。(EntityA具有指向EntityB的导航属性,而EntityB则具有指向EntityA的导航属性)。 关系是'EntityA > One-TO-Many > EntityB'。当我想通过LINQ表达式加载子实体时,我需要使用INCLUDE(STE => Eager Loading),因为我将通过多层传递所有数据。
代码
这是我的代码,用于调用具有其EntityB子项的EntityA。
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 {当前线程处于堆栈溢出状态,无法评估表达式。}
如果我删除 'INCLUDE',则没有错误。我猜原因很简单。我想用子记录 EntityB 加载 EntityA,EntityB 记录每次都要加载其父记录 EntityA,而 EntityA ... 我想每个人都理解这里的无限循环。
我的解决方案或替代方案
- 我进入我的 EDMX 文件并删除了 EntityB 中 EntityA 的导航属性。如果现在我想要加载有关 EntityA 的数据,同时我有一个 EntityB 可以使用。我需要进行单独的 DB 请求,并且我必须通过我的层传递 2 种不同的对象。
- 避免使用 include,分别加载 EntityA 并将其推送到引用 EntityA 的我的 EntityB 的导航属性中。
问题
在我的情况下,是否有更好的替代方案或方法来解决这个问题?我应该继续使用我提出的一种替代方案吗?因为我希望有一个更好和更清洁的解决方案。
感谢您花时间阅读
Ian