2011-04-29 104 views
1

我有一个自我指涉的模型类:功能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; } 
} 

我想查询一个单词的所有同义词,其中超1并返回JSON格式的单词列表在我的MVC 3应用程序:

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

    } 
} 

它未能懒洋洋地初始化集合我得到一个错误。我不知道为什么,因为我仍然在这里的同一个会议,甚至使用交易。

回答

1

结果在执行完成并且在会话结束之后执行得很晚。您返回Json(results)这一事实并不意味着这些结果将立即序列化为JSON。该动作将首先完成执行,然后ASP.NET MVC管道将处理执行结果(OnResultExecuting),并且此时JavaScriptSerializer将触摸到集合。在那段时间,会话和交易早已消失。

因此,要么指示您的ORM热切地获取相关集合,要么更好地查看following series of blog posts并使用视图模型。

+0

谢谢Darin!只有一个后续问题:急于加载列表会导致列表中的所有项目也急切加载?例如,将word.Synonyms.First()。同义词加载以及?对我来说,这看起来像是一个潜在的陷阱,因为如果单词连接在一起,数据库最终可能会提取大量数据。 – 2011-04-30 05:44:12

-1

为了摆脱这个错误,安装Nuget Pacakage Manager Newton.JSON并映射到合适的项目并用[JsonIgnore]装饰属性,这将跳过序列化问题,并且不会出现错误。

相关问题