我使用自定義模型聯編程序在我的操作中綁定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>但是我不知道爲什麼會發生這種情況。
我已經發布了一些代碼。雖然這很簡單。沒有什麼特別的。正如我指出的那樣,S#arp只在請求結束時關閉會話,而我自己不這樣做。它不應該被關閉。更奇怪的是,如果它關閉了,爲什麼最後一個項目仍然沒問題? – queen3