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