尝试删除构造函数中导航属性的初始化,因为它会导致代理对象出现问题。
使用延迟加载与序列化几乎是不可能的,因为当序列化程序访问导航属性时,将加载相关实体。这将导致加载整个数据库。所以你需要禁用延迟加载和使用 Include 加载你想要的任何东西,或者你可以使用一些启用了延迟加载的DTO。
Include
实际上,无论您在服务器端使用实体做什么,WCF DS都不会默认返回扩展实体。这是一个功能。原因是线路上的消息大小。 客户端可以请求此行为(并且这应该可以在不对服务器端的EF实体进行任何修改的情况下工作)。
假设您有一个服务操作GetProducts。您可以发出像〜/ GetProducts?$ expand = Category这样的查询,它将在结果中包含Category实体。
您还注意到客户端无法看到这些内容,但您确实在浏览器中看到了这些内容。所以你已经在使用$ expand吗?如果是这种情况,则问题仅出在客户端上。确保您使用客户端上的$ expand请求结果(取决于您使用的代码,客户端上的LINQ中有一个Expand方法)。然后你可以使用Fiddler来查看客户端是否真的以你想要的方式获得结果。如果是这种情况,并且您仍未在客户端代码中获得结果,则可能是由于MergeOptions。尝试将DataServiceContext.MergeOption设置为OverwriteChanges并重试(但请确保您知道此设置的作用)。