Asp.net mvc NHibernate+;ASP.NET MVC:模型绑定器&x27;会议结束

Asp.net mvc NHibernate+;ASP.NET MVC:模型绑定器&x27;会议结束,asp.net-mvc,nhibernate,s#arp-architecture,Asp.net Mvc,Nhibernate,S#arp Architecture,我使用自定义模型绑定器在操作中绑定订单/订单项。此模型绑定器使用ServiceLocator.Current.GetInstance();而ICart又依赖于IOrderRepository(不确定这是否重要) 现在,当我创建第一个订单项目时,一切正常。当我创建第二个时。然后我尝试显示现在包含两个订单项的订单。这是通过使用 public ActionResult Show(Order order) {} 订单由我的定制活页夹绑定。我跟踪了它的BindModel,发现调用 order =

我使用自定义模型绑定器在操作中绑定订单/订单项。此模型绑定器使用ServiceLocator.Current.GetInstance();而ICart又依赖于IOrderRepository(不确定这是否重要)

现在,当我创建第一个订单项目时,一切正常。当我创建第二个时。然后我尝试显示现在包含两个订单项的订单。这是通过使用

  public ActionResult Show(Order order) {}
订单由我的定制活页夹绑定。我跟踪了它的BindModel,发现调用

  order = cart.GetOrder(id);
订单项目正常-即,我添加了“查看”窗口,查看属性、产品,它们都正常

但是,当控制流转到Show(Order Order)操作方法时,订单的第一项包含无效的产品-访问它们会导致以下错误(著名的错误):

NHibernate.LazyInitializationException:初始化[Orders.Core.OrderItem#5440c233-fb7e-4dc9-8aec-9c8c0115808b]-未能延迟初始化角色集合:Orders.Core.OrderItem.Products,未关闭任何会话或会话

我现在可以在查看order.Items[0]产品时在“监视”窗口中看到这一点

奇怪的是,第二批货还可以!所以如果是这样的话

  • HTTP请求。。。My Model Binder-使用orderRepository.get(id)获取订单-会话对两个订单项都可以
  • mvc发挥了它的魔力
  • 动作方法显示(订单) NHibernate.LazyInitializationException:初始化[Orders.Core.OrderItem#5440c233-fb7e-4dc9-8aec-9c8c0115808b]-未能延迟初始化角色集合:Orders.Core.OrderItem.Products,未关闭任何会话或会话


    表示您在请求产品之前已关闭会话。您确定没有任何内容关闭您的会话吗?也许你可以发布一些代码?

    哦,天哪,我在BaseController上放了[PassParametersDuringRedirect]。我真的做到了,在我试验MvcContrib的时候,我只是忘记了它。它回来了,咬得我好厉害,我花了几个小时来解决这个问题


    所以,问题是我很愚蠢,从中吸取的教训是,我们永远不应该做系统范围的属性/行为,因为从副作用的角度来看,这并不比全局变量好。

    我发布了一些代码。不过,这很简单。没什么特别的。正如我指出的,S#arp只在请求结束时关闭会话,我自己不会这样做。它不应该被关闭。更奇怪的是,如果它是关闭的,为什么最后一个项目仍然是正常的?
    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;
    }
    
    cart.Save(item);
    return RedirectToAction<OrdersController>(c => c.Show(item.Order));
    
    return RedirectToAction("Show", "Orders", new { order = item.Order });
    
       [PassParametersDuringRedirect]
       public class OrdersController