实体框架6.0和WCF

时间:2016-12-16 21:22:28

标签: c# entity-framework 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'   不是预期的。如果是的话,请考虑使用DataContractResolver   使用DataContractSerializer或添加静态未知的任何类型   已知类型的列表 - 例如,通过使用KnownTypeAttribute   属性或将它们添加到传递给的已知类型列表中   串行器。

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

this.Configuration.ProxyCreationEnabled = false;

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

A)我的C#应用​​程序中没有显示各种数据。该数据由Entity Framework提供给应用程序。

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

  

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

在此链接中提供了创建动态Lambda表达式:

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

答案 1 :(得分:0)

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