7

环境

我在框架 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。

问题

在我的情况下是否有更好的选择或方法来解决这个问题?我是否应该继续我提出的替代方案之一?因为我希望有一个更好、更清洁的解决方案。

谢谢你的时间

伊恩

4

3 回答 3

1

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

我还想指出,STE 会让你很头疼。我以前曾与 STE 合作过,现在我真的很想避免他们。您确定要使用 STE 吗?

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

于 2012-10-09T09:51:26.047 回答
0

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

正如我通常在互联网上阅读的那样,当我们怀疑(或有)无限循环案例时,有一些解决方法:

  1. 我们可以通过手动使用和加载子项来使用加载操作。foreach
  2. 我们可以创建一个本身是递归查询的数据库视图(并使用它的实体)。
于 2012-10-02T11:52:35.203 回答
0

看到这个

但是我安装了更新 4,但仍然无法调试

于 2013-12-05T16:04:04.553 回答