2012-08-30 39 views
1

我有一個UnitOfWork/Service模式,在將模型發送到視圖之前,使用NHibernate填充我的模型。出於某種原因,我仍然得到YSOD,我不明白爲什麼對象集合尚未填充。會話已關閉! NHibernate不應該試圖抓取數據

我控制器的方法是這樣的:工作

public ActionResult PendingRegistrations() 
{ 
    var model = new PendingRegistrationsModel(); 
    using (var u = GetUnitOfWork()) 
    { 
     model.Registrations = u.UserRegistrations.GetRegistrationsPendingAdminApproval(); 
    } 
    return View(model); 
} 

服務/單元看起來是這樣的:

public partial class NHUserRegistrationRepository : IUserRegistrationRepository 
{ 
    public IEnumerable<UserRegistration> GetRegistrationsPendingAdminApproval() 
    { 
     var r = 
      from UserRegistration ur in _Session.Query<UserRegistration>() 
      where ur.Status == AccountRegistrationStatus.PendingAdminReview 
      select ur; 
     NHibernateUtil.Initialize(r); 
     return r; 
    } 
} 

我在做什麼錯?

+1

你可以嘗試設置的集合作爲'.Not.LazyLoad()' –

+0

您的映射是什麼意思?我確實嘗試過,但它似乎沒有做任何事情。 –

+0

調用NHibernateUtil.Initialize()之前r的值是什麼? – Maciej

回答

3

您遇到的問題與您與任何其他LINQ提供者所遇到的問題沒有什麼不同。您需要執行查詢才能獲得結果。如果你沒有一個有效的上下文,那是行不通的。

這個問題很容易解決,而不會譴責LINQ到NHibernate。只要改變

public IEnumerable<UserRegistration> GetRegistrationsPendingAdminApproval() 
{ 
    var r = 
     from UserRegistration ur in _Session.Query<UserRegistration>() 
     where ur.Status == AccountRegistrationStatus.PendingAdminReview 
     select ur; 
    NHibernateUtil.Initialize(r); 
    return r; 
} 

public IEnumerable<UserRegistration> GetRegistrationsPendingAdminApproval() 
{ 
    var r = 
     from UserRegistration ur in _Session.Query<UserRegistration>() 
     where ur.Status == AccountRegistrationStatus.PendingAdminReview 
     select ur; 
    NHibernateUtil.Initialize(r); 
    return r.ToList(); 
} 
+0

就這樣。我不知道這一點。我曾嘗試'.AsEnumerable'沒有成功。感謝您的回答。 –

+0

這麼簡單但很漂亮。 +1的解釋 –

相關問題