【问题标题】:StackOverflowException trying to return a Linq query result as a List through a WCF ServiceStackOverflowException 试图通过 WCF 服务将 Linq 查询结果作为列表返回
【发布时间】:2011-04-06 11:33:39
【问题描述】:

我在这方面遇到了很多问题,即使用一个更简单的例子也无法解决。

我有一个 WCF 服务,它返回一个对象列表(来自我的实体模型)。

该模型只有 2 个表: 人员,带有 id、name 和 office_id(外键) 和办公室,有身份证和地址

我正在做一个非常简单的 linq 查询,它返回这些人中的第一个。这可以正常工作,即使“ToList()”方法也可以正常工作。

问题是,当我尝试通过服务返回它时,它会崩溃并显示“在 mscorlib.dll 中发生类型为 'System.StackOverflowException' 的未处理异常”

我认为它在尝试序列化 Person 对象时与导航属性有关。这些导航属性出现在 Person 和 Office 模型中,Person 表有一个“Office”导航属性,但 Office 表也有一个“Person”导航属性!!

我认为这些导航属性对于其他场景可能很有用,但我无法找到一种方法来说不加载这些内容,或者至少不序列化并通过服务返回它!!

这是 linq 查询(有效,列表中确实有一个人):

var query = (from chosen in entities.person
            select chosen).First<person>();

return query.ToList<person>();

有人见过这样的吗?我之前有过几个 WCF-Linq 项目,但从来没有遇到过类似的问题。

提前致谢。

【问题讨论】:

    标签: c# wcf linq entity-framework


    【解决方案1】:

    听起来您遇到了循环引用问题,请尝试使用以下方式装饰您的 Person 和 Office 类:

    [DataContract(IsReference = true)]
    

    【讨论】:

    • 感谢您的回答!我将搜索如何从数据库中装饰一个自动生成的实体(如果可能的话;-))
    • 一个问题,如果两个表之间的唯一关系只是Person具有Office的主键作为外键,它怎么可能是循环引用??
    • 谢谢拉迪斯拉夫。我在问如果模型没有在数据库中设置 Office to Person 导航属性,为什么它会创建它:-S
    【解决方案2】:

    最后我解决了它在实体对象中将 ProxyCreationEnabled 和 LazyLoadingEnabled 都设置为 false:

    Model.Entities entities = new Model.Entities();
    
            public ServicePeople()
            {
                entities.ContextOptions.ProxyCreationEnabled = false;
                entities.ContextOptions.LazyLoadingEnabled = false;
            }
    

    【讨论】:

      【解决方案3】:

      假设您的 WCF 服务使用默认的 DataContractSerializer,请尝试使用 IgnoreDataMemberAttribute 装饰导航属性。

      【讨论】:

      • 感谢您的回答!我将搜索如何装饰从数据库自动生成的实体中的每个属性(如果可能的话;-))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      相关资源
      最近更新 更多