2011-05-09 200 views
0

我使用流利NHibernate映射我的实体,我来到一个集,我有probelsm gettting映射。我已经尝试了SubclassMap的不同变体,但我似乎无法正确映射Cart,Project或Order。 Item,CartItem,OrderItem和ProjectItem很好地映射。我对NHibernate相当陌生,我只是无法弄清楚如何告诉它做我想做的事。与泛型基类的NHibernate映射

编辑:这是我与这个继承结构去为架构:enter image description here

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

似乎Cart,Project和Order不是从Item继承的。这是对的吗? – 2011-05-11 18:37:07

+0

这是正确的,购物车项目和订单都有收藏项目 – scottm 2011-05-12 16:49:24

回答

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) 
0

这是您的映射的简化版本?如果不是:

  1. 您的子类应用缺少对KeyColumn("Item_id");的调用(需要获取每个子类的表映射)。
  2. 您的HasMany电话缺少类似.KeyColumn("Cart_id")的电话。
+0

这是一个简化的映射。 – scottm 2011-05-12 16:48:56