Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6.0和WCF的操作协定序列化错误_C#_Entity Framework_Wcf - Fatal编程技术网

C# 实体框架6.0和WCF的操作协定序列化错误

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

在我的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项目的构造函数中插入了这段代码:

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。这是一点额外的代码,但结果很好,因为我仍然能够使用代理和延迟加载