繁体   English   中英

Entity Framework 6.0和WCF的操作合同序列化错误

[英]Operation Contract Serialization Error With Entity Framework 6.0 and WCF

在我的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预计不会”。 如果您正在使用DataContractSerializer或将任何静态未知的类型添加到已知类型的列表中,请考虑使用DataContractResolver-例如,通过使用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]]'的对象图包含循环,并且如果引用跟踪不能序列化被禁用

这导致我得出以下结论-为了使我的应用程序正常工作,我需要启用代理创建功能,与此同时,我的服务可能有问题。 有人对我为使事情正常进行更改可能有什么建议吗?

当您尝试序列化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

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

暂无
暂无

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

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