Newtonsoft没有序列化导航属性

时间:2016-07-22 14:33:17

标签: c# entity-framework json.net

我有一个EF对象RetailDocuments。它通过外键与DocumentTemplateMaster对象相关。许多RetailDocuments可以使用相同的DocumentTemplateMaster

我正在检索List<RetailDocument>并关闭了代理创建和延迟加载。引用的DocumentTemplateMaster对象位于List中,但不是在序列化时。

我已尝试了一些我在SO和其他地方看过的解决方案,但无论出于何种原因,它都不适合我。

这是我的代码,评论代码显示了我尝试的但似乎没有什么作用的东西:

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位于检索到的列表中。这不是问题。 问题在于序列化,因为它不在序列化字符串

2 个答案:

答案 0 :(得分:0)

如果您关闭了延迟加载,则需要包含导航属性

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

但请注意,Include my会对性能产生一些显着影响。通常,在2个单独的调用中检索值并在内存中添加相关性是很好的。

答案 1 :(得分:0)

经过大量研究后,导航属性似乎还需要具有[DataMember]属性。

一旦我补充说,问题就消失了。

有时这是简单的事情。