获取Nhibernate实体并从Web服务中完成它

时间:2010-05-08 16:35:44

标签: wcf nhibernate

让我说我有一个订单系统。 每个“订单”引用“客户”对象。 当我填写数据访问层中的订单列表时,应该从中获取客户对象 客户Web服务“WCF”。 所以我没有在Order mapping类中映射Customer属性,

        Id(o => o.OrderID).GeneratedBy.Identity();
        //References(o => o.Customer).Not.Nullable().Column("CustomerID");
        HasMany(o => o.Details).KeyColumn("OrderID").Cascade.AllDeleteOrphan();
        Map(c => c.CustomerID).Not.Nullable();

并要求nhibernate会话获取订单列表。 并尝试循环列表中的每个订单以填充其客户财产, doe的任何身体对此都有好主意????

 IList<Order> lst = Session.CreateCriteria<Order>().List<Order>();
 foreach (Order order in lst)
                order.Customer = serviceProxy.GetCustomerByID(order.CustomerID);

2 个答案:

答案 0 :(得分:0)

所以你说你打你的WCF,订单列表是50,50次。不太好。

你应该这样做:

   var customers = serviceProxy.GetCustomersForIDs(lst.Select(x => x.CustomerID).Distinct()); //one hit to WCF

   foreach(var order in lst)
        order.Customer = customers.Single(x => x.ID == order.CustomerID);

那是表演老虎机。

你可以做的另一件事是你想要的(而不是那样的表演,但与你的样本完全相同):

将属性Customer修改为:

       private customer;
       public virtual Customer
       {
            get
            {
                 if(customer == null)
                     customer = serviceProxy.GetCustomerByID(this.CustomerID);
                 return customer;
            }
        }

您的订单应该引用serviceProxy。

答案 1 :(得分:0)

如果确实希望透明地执行此操作,请尝试实现自定义tuplizer(及相关内容)。看一下this article,它为Java Hibernate实现了一个远程延迟加载器,但是一般概念同样适用于NHibernate,因为它具有相同的整体设计(tuplizers,lazy initializers,proxy factory等)。