2016-07-22 89 views
0

我有一個EF對象RetailDocuments。它通過外鍵與DocumentTemplateMaster對象相關。許多RetailDocuments可以具有相同的DocumentTemplateMasterNewtonsoft不是序列化導航屬性

我在檢索List<RetailDocument>並關閉了代理創建和延遲加載。引用的DocumentTemplateMaster對象在List中,但在序列化時不存在。

我試過很多我在這裏看過的解決方案,但是無論出於何種原因,它都不適合我。

這裏是我的代碼,註釋代碼顯示的東西,我做過嘗試,但似乎並沒有有所作爲:

using (RetailDocumentEntities db = new RetailDocumentEntities()) { 
    db.Configuration.ProxyCreationEnabled = false; 
    db.Configuration.LazyLoadingEnabled = false; 
    List<RetailDocument> retailDocuments = 
    retailDocuments = db.RetailDocument.Include("DocumentTemplateMaster").where(x=>x.col2 = "someVal").ToList(); 

    JsonSerializerSettings serializerSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects }; 
string retVal = JsonConvert.SerializeObject(retailDocuments, Formatting.Indented, serializerSettings); 

    //JsonSerializerSettings settings = new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Serialize};// PreserveReferencesHandling = PreserveReferencesHandling.Objects};// ReferenceLoopHandling = ReferenceLoopHandling.Serialize, ReferenceLoopHandling = ReferenceLoopHandling.Serialize }; 
    //string retVal = Newtonsoft.Json.JsonConvert.SerializeObject(retailDocuments, settings); 
    return retVal; 
} 

之前,我把它序列化,DocumentTemplateMaster顯示爲在列表導航屬性,因爲它但應該在序列化時丟失。我敢肯定這是一件我很想念的傻事,但它是什麼?

編輯:上下文已定義,包含在那裏。引用的DocumentTemplateMaster在檢索列表中。這不是問題。 問題出在序列化,因爲它不是序列化的字符串

+0

如果'db'是新的上下文實例,則在運行顯示的代碼後,*不能包含'DocumentTemplateMaster'對象。你如何檢查它的存在? –

+0

查看更新的代碼。我認爲可以理解上下文是定義的:/無論如何,在調試模式下,我可以清楚地看到Document TemplateMaster。 – MetalPhoenix

+1

啊,所以你包括它,很高興知道......你有'PreserveReferencesHandling = PreserveReferencesHandling.Objects',所以你只能在Json中看到一些'DocumentTemplateMaster's。在大多數地方你應該看到類似'「$ ref」:「2」'的東西。 –

回答

0

經過大量的研究後,導航屬性看起來也需要具有[DataMember]屬性。

一旦我補充說明,問題就消失了。

有時是簡單的事情。

0

你需要的,如果你有延遲加載關閉

retailDocuments = db.RetailDocument.Include(x => x.DocumentTemplateMaster).where(x=>x.col2 = "someVal").ToList(); 

但是請注意,包括我有一些顯着的性能inlcude您的導航屬性影響。通常在2個獨立的調用中檢索值並且在內存中添加該關係是比較困難的。

+0

請參閱我的代碼的更新,我已經爲您明確添加了包含。實際的檢索方法是我們使用的自定義方法,它會自動將include包含在那裏。在任何情況下,假設我實際上在返回列表中看到DocumentTemplateMaster對象,那麼include語句不可能是問題。 – MetalPhoenix