我有一个自引用模型类:
public class Word
{
public virtual int Id { get; set; }
public virtual string Text { get; set; }
public virtual IList<Word> Synonyms { get; set; }
public virtual int Extra { get; set; }
}
我正在尝试查询Extra为1的单词的所有同义词,并在我的MVC 3应用程序中返回JSON格式的单词列表:
[HttpPost]
public JsonResult Synonyms(string wordText)
{
using (var session = ...)
{
using (var tx = session.BeginTransaction())
{
var word = session.QueryOver<Word>()
.Where(w => w.Text == wordText)
.SingleOrDefault();
var results = new SynonymsResults()
{
Words = word.Synonyms
.Where(x => x.Extra == 1)
.Select(x => x.Text)
};
return Json(results);
}
}
}
我收到一个错误,它无法懒洋洋地初始化集合。我不知道为什么,因为我仍然在这里,甚至使用交易。
答案 0 :(得分:1)
在操作完成并且在会话之外之后,结果执行得更晚。您返回Json(results)
这一事实并不意味着这些结果会立即序列化为JSON。该操作将首先完成执行,然后ASP.NET MVC管道将处理结果的执行(OnResultExecuting),此时JavaScriptSerializer将触摸集合。那时会话和交易早已不复存在。
因此,要么指示您的ORM急切地获取依赖集合,要么更好地查看following series of blog posts并使用视图模型。
答案 1 :(得分:-1)
要摆脱错误,请安装Nuget Pacakage Manager Newton.JSON并映射到相应的项目并使用[JsonIgnore]装饰属性,这将跳过序列化问题,您将不会收到错误。< / p>