2016-12-16 101 views
1

運行契約序列化錯誤在我的C#應用​​程序中,我試圖通過中間DLL發送請求以將數據添加到QuickBooks。中間DLL基於設置,通過WCF服務發送項添加請求。該服務項目正在使用「操作合同」來管理其中的所有方法。它沒有任何數據合同/數據成員。使用Entity Framework 6.0和WCF

此作品適用於發票和其他交易。然而,加入項目時,我收到此錯誤:

A first chance exception of type 'System.Runtime.Serialization.SerializationException' occurred in System.Runtime.Serialization.dll

Additional information: Type 'System.Data.Entity.DynamicProxies.QBLookUp_A96F53AD8DA6F21651FEF0B25078616AB4989DA745EE06E345D365196574CE0F' with data contract name 'QBLookUp_A96F53AD8DA6F21651FEF0B25078616AB4989DA745EE06E345D365196574CE0F: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer.

放眼望去這裏對堆棧溢出,我遇到了幾個線程建議關閉代理的創建在我的EF模型來解決這個問題。所以我插入這段代碼到構造函數在我的EF項目:

this.Configuration.ProxyCreationEnabled = false; 

然而,當我關掉代理的創建,我碰上了兩個新問題:

A)各種數據的不出現在我的C#應用​​程序中。這些數據由實體框架提供給應用程序。

B)我收到嘗試通過WCF服務,以保存該項目時,這個錯誤:

Additional information: Object graph for type 'System.Collections.Generic.HashSet`1[[EFModel.Item, EFModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' contains cycles and cannot be serialized if reference tracking is disabled

這使我得出以下結論 - 我必須爲了啓用代理的創建我的應用程序工作,同時我可能會爲我的服務做錯事。有沒有人有任何建議,我可以改變,讓事情工作?

回答

0

當您嘗試序列化WCF無法完成的數據時,通常會出現此問題。爲什麼第一個答案適用於某些casea,因爲如果您將關閉代理創建,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

0

在我轉向使用DTO爲所有EF被創造爲這WCF玩不轉代理對象的結束。這是一些額外的代碼,但結果很好,因爲我仍然可以使用代理和延遲加載。