NHibernate映射与通用基类

时间:2011-05-09 22:51:38

标签: c# nhibernate fluent-nhibernate nhibernate-mapping

我正在使用Fluent NHibernate来映射我的实体,我来到了一个我正在使用probelsm gettting映射的集合。我尝试过SubclassMap的不同变体,但我似乎无法正确映射Cart,Project或Order。 Item,CartItem,OrderItem和ProjectItem映射正常。我对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);
        }
    }

2 个答案:

答案 0 :(得分:0)

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

  1. 您的SubclassMappings缺少对KeyColumn("Item_id");的调用(这是获取每子类表映射所必需的。)
  2. 您的HasMany通话缺少.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)