Newtonsoft未序列化导航属性

本文关键字:属性 导航 序列化 Newtonsoft | 更新日期: 2023-09-27 17:58:25

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

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

我已经尝试了很多我在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在List中显示为导航属性,这是它应该显示的,但在序列化时,它是缺失的。我肯定我错过了一件愚蠢的小事,但它是什么?

编辑:上下文已经定义,include就在那里。引用的DocumentTemplateMaster在检索到的列表中。这不是问题所在问题在序列化中,因为它不在序列化字符串中

Newtonsoft未序列化导航属性

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

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

有时是简单的事情。

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

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

但是请注意,Include对性能有一些显著的影响。通常,最好在两个单独的调用中检索值,并在内存中添加关系。