StackOverflowException尝试通过WCF服务将Linq查询结果作为List返回

时间:2011-04-06 11:33:40

标签: c# wcf linq entity-framework

我对这些东西遇到了很多问题,即使用一个更简单的例子也无法解决。

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

该模型只有2个表: 具有id,name和office_id(外键)的人 和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项目,我从来没有遇到任何类似的问题。

提前致谢。

3 个答案:

答案 0 :(得分:3)

听起来你有一个循环引用问题,尝试用:

装饰你的Person和Office类
[DataContract(IsReference = true)]

答案 1 :(得分:3)

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

Model.Entities entities = new Model.Entities();

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

答案 2 :(得分:1)

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