簡體   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