2012-09-12 76 views
3

問:EF代碼第一次 - 從代理獲取POCO

是否有可能與動態代理處理拉出底層POCO當我們需要它們序列化時?

理由:

我有一個要求序列化(XML)我的POCO實體使用EF代碼第一次,但很快發現,DbContext爲我的POCO創建動態代理,這使得它很難序列化。

我曾嘗試以下:

  1. 禁用代理創建在DbContext,只用純POCO工作。這允許我以任何我喜歡的方式序列化實例。唯一的問題是沒有跟蹤導航屬性,因此,我必須手動添加所有相關實體,否則將始終創建新實體(請參閱代碼示例)。
  2. 在POCO上執行ISerializable接口來手動處理序列化。這是很多工作,並不是一個可持續的解決方案。

代碼示例。

// Attach and update tags 
foreach (var tag in entity.Tags) 
{ 
    Context.Entry(tag).State = Context.Tags.Any(t => t.ID == tag.ID) 
            ? EntityState.Modified 
            : EntityState.Added; 
} 

// Attach and update state. 
Context.Entry(entity).State = Context.Resources.Any(x => x.ID == entity.ID) 
            ? EntityState.Modified 
            : EntityState.Added; 

正如你可以想像,複雜性可能失控的時候,我的實體有更多的關係。

回答

4

當我們需要序列化它們時,是否有可能在處理動態代理時抽出 底層POCO?

不,因爲沒有底層POCO - 代理不是實體實例的包裝。它是直接的實體實例。

您可以使用DataContractSerializerProxyDataContractResolver序列化代理波蘇斯但序列化代理的實體聽起來像你想用延遲加載啓用序列化的實體 - 可序列化比預期的多,因爲每個屬性將是懶惰的遞歸加載,直到有整個對象圖中沒有單個非加載的導航屬性。

您還必須在使用DataContractSerializer時通過使用[DataContract(IsReference = true)]標記實體並使用[DataMember]來標記每個可序列化屬性來處理循環引用。

,唯一的缺點是,導航性能沒有被跟蹤

實體沒有代理被跟蹤。跟蹤取決於被附着的實體而不是被代理的實體。

當我要救

,如果你想堅持他們必須始終重視反序列化的實體,我必須手動連接所有相關實體。