TL; DR
从这里获取“子类”示例
https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping。
我希望ChildMap
中的公式使用Name
的{{1}}属性
详细信息
我有一个继承层次结构(Parent
- > Product
,StockProduct
,KitProduct
,ListingProduct
),其中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
?
答案 0 :(得分:0)
我认为同时拥有一个类层次结构和一个属性来告诉你它是什么具体类并不是一个好的设计。您当然不需要此列来实现表每类 。
您应该在基类中使用它:
UseUnionSubclassForInheritanceMapping();
这在子类映射中:
Abstract();
但是,我认为您正在努力实现表格类型
有关三种不同映射策略的详细说明,请参阅此文章:http://www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat