【问题标题】:Operation Contract Serialization Error With Entity Framework 6.0 and WCF实体框架 6.0 和 WCF 的操作合同序列化错误
【发布时间】:2017-05-02 17:37:33
【问题描述】:

在我的 C# 应用程序中,我试图通过中间 DLL 发送请求以将数据添加到 QuickBooks。中间 DLL 基于设置,通过 WCF 服务发送项目添加请求。服务项目对其中包含的所有方法使用操作合同。它没有任何数据契约/数据成员。

这适用于发票和其他交易。但是,在添加项目时,我收到此错误:

类型的第一次机会异常 'System.Runtime.Serialization.SerializationException' 发生在 System.Runtime.Serialization.dll

附加信息:类型 'System.Data.Entity.DynamicProxies.QBLookUp_A96F53AD8DA6F21651FEF0B25078616AB4989DA745EE06E345D365196574CE0F' 带有数据合同名称 'QBLookUp_A96F53AD8DA6F21651FEF0B25078616AB4989DA745EE06E345D365196574CE0F:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' 预计不会。如果您是,请考虑使用 DataContractResolver 使用 DataContractSerializer 或添加任何静态未知的类型 已知类型的列表 - 例如,通过使用 KnownTypeAttribute 属性或通过将它们添加到传递给 序列化器。

在 Stack Overflow 上环顾四周,我遇到了几个建议关闭我的 EF 模型中的代理创建以解决此问题的线程。所以我将这段代码插入到我的 EF 项目的构造函数中:

this.Configuration.ProxyCreationEnabled = false;

但是,当我关闭代理创建时,我遇到了两个新问题:

A) 各种数据位未显示在我的 C# 应用程序中。此数据由实体框架提供给应用程序。

B) 我在尝试通过 WCF 服务保存项目时收到此错误:

附加信息:“System.Collections.Generic.HashSet`1[[EFModel.Item, EFModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]”类型的对象图包含循环,无法序列化如果参考跟踪被禁用

这使我得出以下结论 - 我需要启用代理创建才能使我的应用程序正常工作,同时我的服务可能有问题。有没有人对我可以改变什么来让事情正常工作有什么建议?

【问题讨论】:

    标签: c# entity-framework wcf


    【解决方案1】:

    当您尝试序列化 WCF 无法完成的数据时,通常会出现此问题。为什么第一个答案在某些情况下可以正常工作,因为如果您关闭代理创建 WCF 将知道如果您使用 DataContract 属性标记您的类如果代理将打开则需要序列化哪些数据然后代理类将在 FLY 和 WCF 上创建无法序列化这些类。

    如果您使用的是实体框架,那么我猜您可能一直在使用 lambda 表达式从客户端的 db 中检索这些记录。由于 WCF 默认情况下不序列化 lambda 表达式,因此您不能将 lambda 表达式传递给从客户端查询这些记录。(为什么 - 因为 WCF 用于 SOA 架构并且服务是通用的,因此任何类型的客户端(JAVA、C++ 等)都可以使用这个服务,而 lambda 表达式是特定于某种语言的。如果它会在 WCF 中实现这个功能,那么它将违反 SOA 架构的规则。

    如果您仍想使用 lambda 表达式,则需要创建动态 lambda 表达式。但这不是更好的实现方式,因为客户端将必然以这种方式使用。尽量不要在客户端使用 lambda 表达式。

    此链接中给出了创建动态 Lambda 表达式:

    https://www.codeproject.com/Articles/1079028/Build-Lambda-Expressions-Dynamically

    【讨论】:

      【解决方案2】:

      最后,我对 EF 为 WCF 无法处理的对象创建代理的所有对象使用了 DTO。这是一些额外的代码,但结果很好,因为我仍然可以使用代理和延迟加载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多