C# 流利的NHibernate-';未能延迟初始化集合';-查询集合

C# 流利的NHibernate-';未能延迟初始化集合';-查询集合,c#,nhibernate,asp.net-mvc-3,fluent-nhibernate,C#,Nhibernate,Asp.net Mvc 3,Fluent Nhibernate,我有一个自参考模型类: 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; } } 公共类单词 { 公共虚拟整数Id{get;set;}

我有一个自参考模型类:

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; }
}
公共类单词
{
公共虚拟整数Id{get;set;}
公共虚拟字符串文本{get;set;}
公共虚拟IList同义词{get;set;}
公共虚拟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);
        }

    }
}
[HttpPost]
公共JsonResult同义词(字符串wordText)
{
使用(var会话=…)
{
使用(var tx=session.BeginTransaction())
{
var word=session.QueryOver()
.Where(w=>w.Text==wordText)
.SingleOrDefault();
var results=新同义词results()
{
同义词
.其中(x=>x.Extra==1)
.选择(x=>x.Text)
};
返回Json(结果);
}
}
}

我收到一个错误,它无法延迟初始化集合。但是我不知道为什么,因为我仍然在这里的同一个会话中,甚至使用了一个事务。

在操作完成运行之后,在会话之外,结果会在很久之后执行。返回的
Json(results)
并不意味着这些结果将立即序列化为Json。操作将首先完成执行,然后ASP.NET MVC管道将处理结果的执行(OnResultExecuting),此时JavaScriptSerializer将接触集合。此时,会话和事务早已消失


因此,要么指示您的ORM急切地获取相关集合,要么最好查看并使用视图模型。

要消除错误,请安装Nuget Package Manager Newton.JSON并映射到相应的项目,并使用[JsonIgnore]装饰属性,这将跳过序列化问题,您不会得到错误。

谢谢Darin!只有一个后续问题:急切加载列表会导致列表中的所有项目也急切加载吗?例如,还会加载word.Synonyms.First()同义词吗?对我来说,这似乎是一个潜在的陷阱,因为如果单词被菊花链连在一起,数据库最终可能会取出大量数据。