2009-09-22 29 views
1

我使用自定義模型聯編程序在我的操作中綁定Order/OrderItem。此模型聯編程序使用ServiceLocator.Current.GetInstance(); ICart依次依賴於IOrderRepository(不確定這是否重要)。NHibernate + ASP.NET MVC:模型聯編程序的會話已關閉

現在,一切正常,當我創建第一個訂單項目。當我創建第二個。然後我嘗試顯示現在包含兩個訂單商品的訂單。這是通過使用

public ActionResult Show(Order order) {} 

訂單是由我的自定義活頁夾綁定。我追溯其BindModel看到,該呼叫後

order = cart.GetOrder(id); 

訂購的貨品確定 - 即我添加到監視窗口,查看屬性,產品,和他們都OK。

然而,當控制流程進行到顯示(順序ORDER)的操作方法,順序的第一個項目的無效產品 - 訪問它們會導致以下錯誤(著名的一個):

NHibernate.LazyInitializationException:初始化[Orders.Core.OrderItem#5440c233-fb7e-4dc9-8aec-9c8c0115808b] -failed懶洋洋地初始化角色的集合:Orders.Core.OrderItem.Products,沒有會話或會話關閉

我現在可以看到這在查看order.Items [0] .Products時在監視窗口中。

奇怪的是,第二項還是OK!因此,如果是這樣

  • HTTP請求......我的模型綁定 - 爲了獲得使用orderRepository.Get(ID) - 會議是兩個訂單項目確定...
  • MVC做它的魔力
  • 操作方法顯示(順序ORDER)< - 這裏order.Items會話[0]。產品丟失,而對於項目[1]是不是

如果我添加其他項目的順序,然後在顯示(),只有Item [2] .Products是正確的,Item [0]和Item [1] Products都是壞的(沒有會話)。

這是怎麼回事?

我使用夏普體系結構和會議每請求。我實際上證實EndRequest不會在模型聯編程序獲取其順序和Show()接收錯誤之間調用。

UPDATE:一些代碼(重要的線)

public class Cart : ICart 
{ 
     public Cart(IOrderRepository orderRepository, ICurrentUser currentUser, IUserSessionStorage storage) {} 
     public Order GetOrder(Guid id) 
     { 
     return orderRepository.Get(id); 
     } 
} 

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
    var cart = ServiceLocator.Current.GetInstance<ICart>(); 
    //Guid guidId = new Guid(id_value_from_context); 
    var order = cart.GetOrder(guidId); // here order is OK completely 
    return order; 
} 

OrderRepository是S#ARP架構庫,並使用WebSessionStorage類,它只是在EndRequest處理程序關閉會話。正如我所說,我已經證實它不會在訂單之間被調用,而且訂單不是。

更新:我不知道這是否可能是因爲orderRepository.Save(order)附近的手動事務。明天將進行調查,但在SO上發現類似的內容。

UPDATE:此外,出現這種情況只有在此之後:

cart.Save(item); 
return RedirectToAction<OrdersController>(c => c.Show(item.Order)); 

當我然後到地址欄,然後按「Enter」鍵刷新頁面,它工作正常。所以這是一次性問題。

有什麼好笑的,有沒有這樣的錯誤,如果我做的:

return RedirectToAction("Show", "Orders", new { order = item.Order }); 

所以它的東西與MvcContrib試圖處理順序的TempData,我想說......

我發現我有這樣的控制器:

[PassParametersDuringRedirect] 
    public class OrdersController 

,並認爲我的命令參數來自TempData的,而不是ModelBinder的...雖然模型綁定確實火了。但是當我刪除屬性時,問題並沒有消失。所以這是來自MvcContrib的RedirectToController>但是我不知道爲什麼會發生這種情況。

回答

0

哦,我的天啊,我把[PassParametersDuringRedirect]放在我的BaseController上。我真的這樣做了,在我嘗試使用MvcContrib的時候,只是忘了它。它回來了,咬我這麼糟糕,我已經失去了幾個小時試圖解決這個問題。

所以,問題在於我是愚蠢的,從中學到的教訓是,一個人不應該做全系統的屬性/行爲,因爲從副作用的角度來看,這並不比全局變量更好。

0

NHibernate.LazyInitializationException:初始化[Orders.Core.OrderItem#5440c233-fb7e-4dc9-8aec-9c8c0115808b] -failed懶洋洋地初始化角色的集合:Orders.Core.OrderItem.Products,沒有會話或會話已關閉

表示您在請求產品之前關閉了會話。你確定沒有關閉你的會議嗎?也許你可以發佈一些代碼?

+0

我已經發布了一些代碼。雖然這很簡單。沒有什麼特別的。正如我指出的那樣,S#arp只在請求結束時關閉會話,而我自己不這樣做。它不應該被關閉。更奇怪的是,如果它關閉了,爲什麼最後一個項目仍然沒問題? – queen3