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

C# EF/LINQ当存在双向关系时如何包含子实体,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,环境 我正在Framework4.0上使用EntityFramework5。(这意味着我实际使用的是EF 4.4)。 作为实体,我使用STE(自跟踪实体),因为我在N层应用程序中工作。 我们使用数据库驱动的方法,因为EF是在游戏的后面引入的 上下文 我有两个实体,它们彼此都有导航属性。(EntityA具有指向EntityB的导航属性,EntityB具有指向EntityA的导航属性)。 关系为“EntityA>一对多>EntityB”。当我想通过LINQ表达式加载子实体时,我需要使用INCLUDE

环境

我正在Framework4.0上使用EntityFramework5。(这意味着我实际使用的是EF 4.4)。 作为实体,我使用STE(自跟踪实体),因为我在N层应用程序中工作。 我们使用数据库驱动的方法,因为EF是在游戏的后面引入的

上下文

我有两个实体,它们彼此都有导航属性。(EntityA具有指向EntityB的导航属性,EntityB具有指向EntityA的导航属性)。 关系为“EntityA>一对多>EntityB”。当我想通过LINQ表达式加载子实体时,我需要使用INCLUDE(STE=>Eager-load),因为我将通过几个层传递所有数据

代码

下面是我调用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{无法计算表达式,因为 当前线程处于堆栈溢出状态。}

删除“INCLUDE”时没有错误。 我想原因很简单。我想用子记录EntityB加载EntityA,EntityB记录想每次加载其父记录EntityA,EntityA。。。我想大家都理解这里的无限循环

我的解决方案或备选方案

  • 我转到我的EDMX文件并删除EntityB中EntityA的导航属性。如果我现在想在处理EntityB时加载EntityA的数据。我需要做一个单独的数据库请求,我有两个不同的对象,我必须通过我的层传递
  • 避免使用include,单独加载EntityA并将其推入引用my EntityA的my EntityB的导航属性
问题

在我的情况下,有没有更好的替代方案或方法来解决这个问题?我是否应该继续我提出的备选方案?因为我希望有一个更好更干净的解决方案

谢谢你抽出时间

伊恩

我来这里是想对你说“你可以使用
包含
”,但显然它在这种情况下对你没有帮助

正如我通常在互联网上读到的,当我们怀疑(或有)无限循环的情况时,有一些解决办法:

  • 我们可以通过使用
    foreach
    使用操作并手动加载子级
  • 我们可以自己创建一个数据库(并使用它的实体)

  • 我试图在EF 5(Visual Studio 2012)中重现您的问题,但没有发现任何错误。还有什么会引起你的问题吗?它是否使用简单的POCO设置

    我还想指出,STE's会让你头疼。我以前和STE合作过,现在我真的在努力避免他们。您确定要使用STE吗

    代替使用STE,您可以使用普通的旧DTO。您将在服务器上保留您的富域模型,并且只向客户端发送必要的数据。通过这种方式,您可以为每个用例创建具有最少数据量的定制DTO。


    但是,我已经安装了update 4,仍然无法为您调试一个非常好的(第一个)问题。我试图在EF 5(Visual Studio 2012)中重现您的问题,但没有收到任何错误。还有什么会引起你的问题吗?它是否使用简单的POCO设置?(旁注..我以前使用过STE,现在我真的在努力避免它们。你确定要使用STE吗?)我也无法重现错误(EF5、.NET 4.0)。有没有可能发布stacktrace并清空敏感数据?好的,我发现下一步:我的项目是一个Webapp。当我在PC上本地运行Webapp并调用该方法时,会引发此错误。当我从测试类运行完全相同的方法时,不会抛出错误。但是当webapp抛出错误时,我可以通过删除“include”来修复它,所以我假设错误必须在这一行。除了“类型的未处理异常”System.StackOverflowException“发生在mscorlib.dll中之外,我没有更多的stacktrace。“@WouterdeKort:因为我一直使用N层设计,所以无法使用其他类型-1。无法应用加载操作,因为我的导航属性不是EntityCollections,而是TrackableCollection-2。遗憾的是,这不适用于我的背景。例如,我希望轻松访问父实体(EntityA)并将其保存为EntityB的字段。我测试了“context.LoadProperty(EntityB,“EntityA”)”,但也生成了相同的StackOverflowException。谢谢你的提示