3

我一直在閱讀關於實體框架上下文中使用Linq實體和​​不同的可能序列化器:Binary,XmlSerializer和DataContractSerializer的實體圖的序列化。 正如我所理解的二進制和XmlSerializer序列化實體沒有它的關係。在關係序列化的情況下,由於生成的xml文件結構的性質(對於XmlSerializer),會導致問題。 除非延遲加載被禁用,否則DataContractSerializer會將圖形的整個深度序列化。實體框架和DataContractSerializer

我的問題是:我想序列化一部分圖。例如,如果我有一個實體A和三個相關實體B,C和D,那麼只有B和D會與A序列化。我想使用DataContractSerializer。如果我刪除不需要的導航屬性的[DataMemberAttribute],它會起作用嗎?

+0

我將Lazy加載屬性保持爲true,並嘗試使用有限圖表:Northwind數據庫:訂單(主要實體),客戶序列化以及員工和訂單詳細信息不是。但是這是一個選擇實體的問題。客戶在訂單旁邊的數據模型中沒有關係,因此序列化它不會導致問題。然而,員工是一個更復雜的實體,並且在不禁用延遲加載的情況下對其進行序列化將在反序列化時引發異常。 – Rahma

回答

0

由於屬性是靜態元數據,所以不能在運行時混淆它們。如果你從實體中刪除它們,它們將被永久刪除。

延遲加載不是你想要的,因爲當你加載你帶來整個圖形時,部分圖形通常只會在更新或部分插入時出現。

從我收集的內容來看,當您要更新某些內容時,只想更新部分圖形,而不是客戶端上的整個圖形。實現此目的的一種方法是刪除手動操作的其他DataMembers,並將它們設置爲null,將它們序列化,更新,並修復先前設置的空引用,最後確保ChangeTracker全部處於先前的狀態。

在我們特定的開發環境中,我們通過T4模板實現了這一行爲,該模板生成所有凌亂代碼,生成「DataManager」的一部分,用於處理客戶端上存在的所有自跟蹤實體。

1

實際上,您可以禁用延遲加載,序列化/反序列化,然後重新啓用延遲加載。

context.ContextOptions.LazyLoadingEnabled = false;

StackOverflow Source

0

以我的經驗,這似乎是唯一可靠的方法來禁用延遲加載是去實體設計絡筒機,在背景中單擊鼠標右鍵,選擇「屬性」 ,並在「屬性」窗口中將「延遲加載已啓用」設置爲false。