我在这方面遇到了很多问题,甚至用一个更简单的例子也解决不了。
我有一个WCF服务,返回对象列表(从我的实体模型)。
模型只有2个表:Person,带有id, name和office_id(外键)和Office, id和地址
我正在做一个非常简单的linq查询,返回这些人中的第一个。这是工作正常,甚至"ToList()"方法工作正常。
问题是,当我试图通过服务返回它时,它会崩溃,并出现"类型为'System '的未处理异常"。StackOverflowException' occurred in mscorlib.dll"
我认为当它试图序列化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项目,从来没有遇到过类似的问题。
听起来你有一个循环引用的问题,试着用:
[DataContract(IsReference = true)]
最后我解决了在实体对象中将ProxyCreationEnabled和LazyLoadingEnabled设置为false的问题:
Model.Entities entities = new Model.Entities();
public ServicePeople()
{
entities.ContextOptions.ProxyCreationEnabled = false;
entities.ContextOptions.LazyLoadingEnabled = false;
}
假设您的WCF服务使用默认的DataContractSerializer
,请尝试用IgnoreDataMemberAttribute
装饰导航属性。