让我说我有一个订单系统。 每个“订单”引用“客户”对象。 当我填写数据访问层中的订单列表时,应该从中获取客户对象 客户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);
答案 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等)。