NHibernate - '惰性初始化集合失败'—查询单个集合

本文关键字:集合 失败 查询 单个 NHibernate 初始化 | 更新日期: 2023-09-27 17:53:44

我有一个自我引用的模型类:

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);
        }
    }
}

我得到一个错误,它无法惰性初始化集合。我不知道为什么,因为我仍然在同一个会话中,甚至使用一个事务。

NHibernate - '惰性初始化集合失败'—查询单个集合

结果执行得要晚得多,在操作完成运行并在会话之外之后。返回Json(results)并不意味着这些结果将立即序列化为JSON。操作将首先完成执行,然后ASP。. NET MVC管道将处理结果的执行(onresultexecution),正是在这一点上,JavaScriptSerializer将触摸集合。此时,会话和事务早已不复存在。

因此,要么指示您的ORM急切地获取依赖集合,要么更好地查看以下系列博客文章并使用视图模型。

要消除这个错误,安装Nuget package Manager Newton。JSON和映射到适当的项目,并使用[JsonIgnore]装饰属性,这将跳过序列化问题,你不会得到错误。

相关文章: