繁体   English   中英

如何将EF对象作为WCF方法结果返回

[英]How to return an EF object as WCF method result

我正在使用EF和WCF。 我想将EF生成的对象用作从Web服务方法返回的对象。 在OperationContract方法中,我执行以下操作:

try
{
   b = (from bon in this.znDbContext.BonSet
        where bon.IdPr == pa.IdPr
        select bon).First();    
}
catch (InvalidOperationException) { }

return b;

如果我调用Web服务方法,将收到以下错误消息:

调用服务失败。 可能的原因:服务离线或无法访问; 客户端配置与代理不匹配; 现有代理无效。 有关更多详细信息,请参考堆栈跟踪。 您可以尝试通过启动新代理,恢复为默认配置或刷新服务来进行恢复。

在Google上搜索,我找到了解决此问题的解决方案。 此语句已添加:

this.znDbContext.Configuration.ProxyCreationEnabled = false;

这样,客户端从Web服务方法接收响应,但是每个内部对象都具有空值。 如果删除前面的语句并执行对象的副本(逐字段),则客户端会收到带有内部对象设置正确的对象(即boni.User)。 例如我做:

boni = new Bon();
User u = new User();
boni.IdPr = b.IdPr;
boni.Date = b.Date;
boni.System = b.System;
u.Id = b.User.Id;
u.Name = b.User.Name;
u.Login = b.User.Login;
boni.User = u;
return boni;

有没有一种方法可以返回带有所有内部对象的完整对象,而无需执行“克隆”操作? 我想要从DbContext分离对象以获得避免手动复制操作的新对象的方法。

对此问题的原因进行理论解释非常受欢迎。

当您将ORM代理与DTO混合使用时,就会有此问题。 此问题/解决方案在WCF中很常见,也适用于任何其他ORM,例如nHibernate。

如果您从ORM中获取实体,通常会返回一个代理,该代理能够从数据库中延迟加载数据。 例如,它只会在您首次访问属性时才加载它的实际数据。 这意味着,如果您从EM中获取“ Bon”对象,它将为您提供“ BonProxy”对象。 显然,DataContract中没有预期的“ BonProxy”(并且您也无法将其传递给客户端,因为您将无法进一步延迟加载客户端)

解决方案: 将您的复杂实体转换为DTO (即,进行现场到现场的复制),然后直接通过电线发送DTO。 这对于序列化也是必要的-您可以控制它以避免循环引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM