nHibernate从子子类开始加载关系

时间:2011-05-10 16:13:52

标签: c# nhibernate fluent-nhibernate linq-to-nhibernate

说我有以下类定义:

public class Order
{
    public virtual int Id { get; protected set; }
    public virtual IList<OrderItemBase> OrderItems { get; set; }
}

public class OrderItemBase
{
    public virtual int Id { get; protected set; }
    public virtual string OrderRef { get; set; }
}

public class ProductOrder : OrderItemBase
{
    public virtual Product Product { get; set; }
}

public class OtherOrder : OrderItemBase
{
    public virtual string MiscData { get; set; }
}

public class Product
{
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }
}

使用以下方式的映射:

public class OrderMap : ClassMap<Order>
{
    this.Id(x => x.Id);
    this.HasMany(x => x.OrderItems).Inverse().KeyColumn("OrderId").Cascade.All();
}

public class OrderItemMap : ClassMap<OrderItembase>
{
    this.Id(x => x.Id);
    this.Map(x => x.OrderRef);
    this.DiscriminateSubClassesOnColumn("OrderTypeId");
}

public class ProductOrderMap : ClassMap<ProductOrder>
{
    this.DiscriminatorValue(1);
    this.References(x => x.Product).Column("ProductId");
}

public class OtherOrderMap : ClassMap<OtherOrder>
{
    this.DiscriminatorValue(2);
    this.Map(x => x.MiscData);
}

public class ProductMap : ClassMap<Product>
{
    // ... can't be arsed to type more code in here, you get the idea
}

现在提问题:

当我为订单存储库编写查询时,我想要一些方法来急切加载所有OrderItems:

return this.All()
    .Where(o => o.Id == id)
    .FetchMany(o => o.OrderItems)

还有一些方法可以加载相关的ProductOrder产品项目:

return this.All()
    .Where(o => o.Id == id)
    .FetchMany(o => o.OrderItems) // Ok so far...
    .ThenFetch(oi => oi.Product) // Uh-oh, the base order item doesn't have Product

我怎样才能获得一个子类别的项目来急切加载它的关系,但只有在我想要的时候呢?

0 个答案:

没有答案
相关问题