nHibernate Per表类映射,公式引用父属性

时间:2013-09-05 15:05:24

标签: c# sql nhibernate

TL; DR

从这里获取“子类”示例

https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping

我希望ChildMap中的公式使用Name的{​​{1}}属性

详细信息

我有一个继承层次结构(Parent - > ProductStockProductKitProductListingProduct),其中Inventory_Product表包含所有公共字段,以及VariationParentProduct / Inventory_StockProduct等,包含子类的特定字段。我相信这叫做子类表映射。

在我的基类Inventory_KitProduct上,我有一个名为Product的属性。

ProductType

和映射

public abstract class Product
{
    public virtual Guid ProductID { get; set; }

    public abstract ProductType ProductType { get; }

    public virtual int AvailableQuantity { get; set; }
}

public class StockProduct : Product
{
    // Some other fields
    public override ProductType ProductType
    {
        get { return ProductType.Stock; }
    }
}

public class KitProduct : Product
{
    // Some other fields
    public override ProductType ProductType
    {
        get { return ProductType.Kit; }
    }
}

public class ListingProduct : Product
{
    // Some other fields
    public override ProductType ProductType
    {
        get { return ProductType.Listing; }
    }
}

public class VariationParentProduct : Product
{
    // Some other fields
    public override ProductType ProductType
    {
        get { return ProductType.VariationParent; }
    }
}

public enum ProductType
{
    Stock = 0,
    Kit = 1,
    Listing = 2,
    VariationParent = 3
}

我需要以某种方式在public class ProductMap : ClassMap<Product> { public ProductMap() { Table("Inventory_Products"); Id(x => x.ProductID).GeneratedBy.Guid(); Map(x => x.Sku); Map(x => x.ProductType).CustomType<ProductType>().Access.ReadOnly(); } } public class StockProductMap : SubclassMap<StockProduct> { public StockProductMap() { Table("Inventory_StockProducts"); KeyColumn("ProductID"); Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 0 THEN (1) ELSE NULL END)"); } } public class KitProductMap : SubclassMap<KitProduct> { public KitProductMap () { Table("Inventory_KitProducts"); KeyColumn("ProductID"); Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 0 THEN (2) ELSE NULL END)"); } } / StockProduct上定义的公式中访问它以执行不同的SQL

我试过KitProduct

StockProduct

和KitProduct

Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 0 THEN (1) ELSE NULL END)") 

但是nhibernate前缀Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 1 THEN (2) ELSE NULL END)") 带有[ProductType | KitProduct]的表别名,而不是基本产品。所以它的引用列不存在

父对象的公式中是否等效StockProduct

1 个答案:

答案 0 :(得分:0)

我认为同时拥有一个类层次结构和一个属性来告诉你它是什么具体类并不是一个好的设计。您当然不需要此列来实现表每

您应该在基类中使用它:

UseUnionSubclassForInheritanceMapping();

这在子类映射中:

Abstract();

但是,我认为您正在努力实现表格类型

有关三种不同映射策略的详细说明,请参阅此文章:http://www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat