C# 实体框架6.0和WCF的操作协定序列化错误
在我的C#应用程序中,我试图通过中间DLL发送一个请求,向QuickBooks添加数据。中间DLL基于设置,通过WCF服务发送项添加请求。该服务项目对其内的所有方法使用操作合同。它没有任何数据合约/数据成员 这项工作适用于发票和其他交易。但是,添加项目时,我收到以下错误: 类型的第一次机会例外 中发生“System.Runtime.Serialization.SerializationException” System.Runtime.Serialization.dll 附加信息:类型 'System.Data.Entity.DynamicProxies.QBLookUp_A96F53AD8DA6F21651FEF0B25078616AB4989DA745EE06E345D365196574CE0F' 使用数据合同名称 “QBLookUp_A96F53AD8DA6F21651FEF0B25078616AB4989DA745EE06E345D365196574CE0F:” 这是预料不到的。如果您是,请考虑使用DATACONTROTCTIFER 使用DataContractSerializer或将任何静态未知的类型添加到 已知类型的列表-例如,通过使用KnownTypeAttribute 属性,或将它们添加到传递给 序列化程序 看看这里关于堆栈溢出的情况,我遇到了几个线程,它们建议在我的EF模型中关闭代理创建来解决这个问题。因此,我在EF项目的构造函数中插入了这段代码:C# 实体框架6.0和WCF的操作协定序列化错误,c#,entity-framework,wcf,C#,Entity Framework,Wcf,在我的C#应用程序中,我试图通过中间DLL发送一个请求,向QuickBooks添加数据。中间DLL基于设置,通过WCF服务发送项添加请求。该服务项目对其内的所有方法使用操作合同。它没有任何数据合约/数据成员 这项工作适用于发票和其他交易。但是,添加项目时,我收到以下错误: 类型的第一次机会例外 中发生“System.Runtime.Serialization.SerializationException” System.Runtime.Serialization.dll 附加信息:类型 'Sys
this.Configuration.ProxyCreationEnabled = false;
但是,当我关闭代理创建时,我遇到了两个新问题:
A) 我的C#应用程序中没有显示各种数据位。此数据由实体框架提供给应用程序
B) 我在尝试通过WCF服务保存项目时收到此错误:
其他信息:“System.Collections.Generic.HashSet`1[[EFModel.Item,EFModel,Version=1.0.0,Culture=neutral,PublicKeyToken=null]]类型的对象图包含周期,如果禁用引用跟踪,则无法序列化
这使我得出以下结论:我需要启用代理创建,以便我的应用程序能够工作,同时我的服务可能有问题。是否有人对我可以更改哪些内容以使其正常工作有任何建议?当您尝试序列化WCF无法完成的数据时,通常会出现此问题。为什么第一个答案适用于某些情况a因为如果您关闭代理创建,WCF将知道哪些数据需要序列化如果您使用DataContract属性标记您的类如果代理将打开,则代理类将动态创建,而WCF无法序列化这些类 如果您使用的是实体框架,那么我猜您应该使用lambda表达式从客户机中的数据库检索这些记录。由于WCF默认不串行化lambda表达式,因此不能通过lambda表达式来查询来自客户端的记录。(为什么-因为WCF用于SOA架构,服务是通用的,因此任何类型的客户端(java、C++等)可以使用此服务,并且lambda表达式特定于某种语言。如果它将在WCF中实现此功能,则将违反SOA体系结构的规则) 如果仍要使用lambda表达式,则需要创建动态lambda表达式。但这并不是更好的实现方式,因为客户端必须以这种方式使用。尽量不要在客户端中使用lambda表达式 创建动态Lambda表达式在以下链接中给出:
当您尝试序列化WCF无法完成的数据时,通常会出现此问题。为什么第一个答案适用于某些情况a因为如果您关闭代理创建,WCF将知道哪些数据需要序列化如果您使用DataContract属性标记您的类如果代理将打开,则代理类将动态创建,而WCF无法序列化这些类 如果您使用的是实体框架,那么我猜您应该使用lambda表达式从客户机中的数据库检索这些记录。由于WCF默认不串行化lambda表达式,因此不能通过lambda表达式来查询来自客户端的记录。(为什么-因为WCF用于SOA架构,服务是通用的,因此任何类型的客户端(java、C++等)可以使用此服务,并且lambda表达式特定于某种语言。如果它将在WCF中实现此功能,则将违反SOA体系结构的规则) 如果仍要使用lambda表达式,则需要创建动态lambda表达式。但这并不是更好的实现方式,因为客户端必须以这种方式使用。尽量不要在客户端中使用lambda表达式 创建动态Lambda表达式在以下链接中给出:
最后,我对EF正在为WCF无法处理的对象创建代理的所有对象使用DTO。这是一点额外的代码,但结果很好,因为我仍然能够使用代理和延迟加载 最后,我求助于对EF正在为WCF无法处理的对象创建代理的所有对象使用DTO。这是一点额外的代码,但结果很好,因为我仍然能够使用代理和延迟加载