EF/LINQ如何在存在双向关系时包含子实体

Ian*_*ers 7 c# linq-to-entities entity-framework

环境

我在Framework 4.0上使用Entity Framework 5.(这意味着我实际上使用的是EF 4.4).作为实体我使用STE(自我跟踪实体)因为我在N-Tier应用程序中工作.我们使用数据库驱动的方法,因为EF是在游戏后期引入的.

上下文

我有两个实体,彼此都有一个导航属性.(EntityA具有EntityB的导航属性,EntityB具有EntityA的导航属性).关系是'EntityA> One-To-Many> EntityB'.当我想通过LINQ表达式加载子实体时,我需要使用INCLUDE(S​​TE => 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;
}
Run Code Online (Sandbox Code Playgroud)

错误

System.StackOverflowException {无法计算表达式,因为当前线程处于堆栈溢出状态.}

删除'INCLUDE'时没有错误.我想原因很简单.我想加载带有子记录EntityB的EntityA,EntityB记录每次都要加载其父EntityA,而EntityA ......我想每个人都理解这里的无限循环.

我的解决方案或替代品

  • 我转到我的EDMX文件并删除EntityB中EntityA的导航属性.如果我现在想要加载有关EntityA的数据,而我有一个EntityB供我使用.我需要做一个单独的DB请求,我有两个不同的对象,我必须通过我的层传递.
  • 避免使用include,单独加载EntityA并将其推送到我的EntityB的导航属性中,该属性引用我的EntityA.

这个问题

在我的情况下,有更好的替代方法或方法来解决这个问题吗 我应该继续提出我提出的替代方案吗?因为我希望有一个更好,更清洁的解决方案.

我感谢你的时间

伊恩

Wou*_*ort 1

我尝试在 EF 5 (Visual Studio 2012) 中重现您的问题,但没有收到任何错误。还有其他什么可能会导致您的问题吗?它可以使用简单的 POCO 设置吗?

我还想指出,STE 可能会让您非常头疼。我以前曾与 STE 合作过,现在我真的想避开它们。您确定要使用 STE 吗?

您可以使用普通的旧 DTO,而不是使用 STE。您将在服务器上保留丰富的域模型,并仅将必要的数据发送到客户端。通过这种方式,您可以为每个用例使用最少的数据创建定制的 DTO。