【发布时间】:2013-09-05 15:05:23
【问题描述】:
TL;DR
以这里的“子类”为例
https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping。
我想在ChildMap 中有一个公式,它使用Parent 的Name 属性
详细信息
我有一个继承层次结构(Product -> StockProduct、KitProduct、ListingProduct、VariationParentProduct),其中 Inventory_Product 表包含所有公共字段,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/KitProduct 上定义的公式中访问它以执行不同的 SQL
我试过StockProduct
Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 0 THEN (1) ELSE NULL END)")
和套件产品
Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 1 THEN (2) ELSE NULL END)")
但是 nhibernate 使用 [KitProduct|StockProduct] 的表别名而不是基本产品前缀 ProductType。所以它引用的列不存在
父对象的公式中是否有与this. 等效的值?
【问题讨论】:
-
ProductType可以是 1 还是 0? -
将您的整个地图和课程置于问题之中。
-
请发布示例代码,以便我们为您提供帮助。另外,以后请务必将您的代码标记为代码,以使其更具可读性!
-
抱歉,第一次发帖到 SO,不确定规则 :) 现在更新帖子
-
根据我的经验,最好将表名/列包含在 [] 中,以防止 NHibernate 在原始 sql 中修改它们,例如
(CASE [ProductType] WHEN 1 THEN (1) ELSE NULL END)
标签: c# sql nhibernate