2011-04-29 90 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]裝飾屬性,這將跳過序列化問題,並且不會出現錯誤。

相關問題