我有一个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在检索到的列表中。这不是问题所在问题在序列化中,因为它不在序列化字符串中
经过大量研究,导航属性似乎也需要具有[DataMember]
属性。
一旦我补充了这一点,问题就消失了。
有时是简单的事情。
如果您关闭了延迟加载,则需要包含导航属性
retailDocuments = db.RetailDocument.Include(x => x.DocumentTemplateMaster).where(x=>x.col2 = "someVal").ToList();
但是请注意,Include对性能有一些显著的影响。通常,最好在两个单独的调用中检索值,并在内存中添加关系。