2016-07-22 75 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