我正在使用Fluent NHibernate来映射我的实体,我来到了一个我正在使用probelsm gettting映射的集合。我尝试过SubclassMap的不同变体,但我似乎无法正确映射Cart,Project或Order。 Item,CartItem,OrderItem和ProjectItem映射正常。我对NHibernate相当陌生,我无法弄清楚如何告诉它做我想做的事。
编辑:这是我要使用此继承结构的模式:
public abstract class Item
{
public virtual int Id {get;set;}
public virtual decimal Price {get;set;}
}
public class CartItem : Item
{
public virtual string ProjectName {get;set;}
}
public class OrderItem : Item
{
public virtual IList<Payment> Payments {get;set;}
}
public class ProjectItem : Item
{
public virtual string ProjectName {get;set;}
}
public abstract class ItemCollection<T> where T: Item
{
public virutal IList<T> Items {get;set;}
}
public abstract class CommerceCollection<T> : ItemCollection<T> where T : Item
{
public virtual decimal Total {get;set;}
}
public class Project : ItemCollection<ProjectItem>
{
public virtual string ProjectName {get;set;}
}
public class Cart : CommerceCollection<CartItem> {}
public class Order : CommerceCollection<OrderItem>
{
public virtual string OrderTrackingNumber {get;set;}
}
/*------- MAPS -------*/
public class ItemMap: ClassMap<Item>
{
public ItemMap()
{
MapId();
Map(x=> x.Price);
}
}
public class OrderItemMap : SubclassMap<OrderItem>
{
public OrderItemMap()
{
Map(x => x.OrderItemProperty);
}
}
public class CartItemMap : SubclassMap<CartItem>
{
public CartItemMap()
{
Map(x => x.CartItemProperty);
}
}
public class ProjectItemMap : SubclassMap<ProjectItem>
{
public ProjectItemMap()
{
Map(x => x.ProjectItemProperty);
}
}
public class CartMap : ClassMap<Cart>
{
public CartMap()
{
Map(x => x.Total);
HasMany(x => x.Items);
}
}
public class OrderMap : ClassMap<Order>
{
public OrderMap()
{
Map(x => x.Total);
HasMany(x => x.Items);
}
}
答案 0 :(得分:0)
这是您的映射的简化版本吗?如果不是:
KeyColumn("Item_id");
的调用(这是获取每子类表映射所必需的。).KeyColumn("Cart_id")
之类的通话。答案 1 :(得分:0)
我想出了我需要做的事情。对于实现泛型基类(CommerceCollection)的类,我必须使用它的参数为泛型集合添加一个映射,然后在子类上指定KeyColumn属性。
这是新的CartMap:
public class CartCollectionMap : CommerceCollectionMap<CartItem> {}
public class CartMap: SubclassMap<Cart>
{
public CartMap()
{
KeyColumn("CommerceCollection_id");
}
}
Nhibernate正在生成如下所示的SQL,它会在列名称中失败。
CREATE TABLE Cart (CommerceCollection'1_id int PRIMARY KEY)