EF5,从代理类型中提取POCO并将响应序列化为Json

时间:2013-12-13 09:02:16

标签: json wcf entity-framework proxy poco

我一直在做研究,这个问题看起来像是在回答,但不完全符合我的需要。简而言之,我使用EF5,延迟加载,从数据库返回的对象都是代理类型,我的WCF Web服务需要以json格式返回它们。在知道无法序列化代理类型之后,我尝试使用ApplyDataContractResolverAttribute + ProxyDataContractResolver在响应之前将代理类型转换回POCO类型。不幸的是,在添加ProxyDataContractResolver之后,DataContractSerializer仍在尝试序列化代理类型并给我序列化异常。许多在线解决方案涉及关闭延迟加载或关闭ProxyCreationEnabled

我的第一个问题是:它是否存在一个解决方案,我仍然可以利用EF的延迟加载,并且仍能将POCO类型作为Json序列化回我的客户端?

我的第二个问题是:对于我的情况,最佳做法应该是什么?

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

最好的办法是配置模型并告知应映射哪些属性。像这样,不会有数据过载。 使用ScriptIgnore属性应该有效。

示例:

[Serialize]
public class Person{
  public int ID {get;set;}
  public virtual List<Role> Roles {get;set;}
  //other properties
}
[Serialize]
public class Role{
  public int ID {get;set;}
  [ScriptIgnore]
  public virtual List<Person> PersonsInRole {get;set;}
  //other properties
}

在示例中,将映射用户的角色,但不会序列化导航属性PersonsInRole of Role以防止溢出。

关于第二个问题。最简单的方法就是使用JSON.NET来序列化。

答案 1 :(得分:0)

我最终重构了我的EF数据模型(以避免循环)并放弃使用延迟加载。