nHibernate 每个表类映射,公式引用父操作前

本文关键字:引用 操作 映射 nHibernate | 更新日期: 2023-09-27 18:30:23

TL;DR

以这里的"子类"为例

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

我想在ChildMap中有一个使用 Name 属性的公式 Parent

长细节

我有一个继承层次结构(Product -> StockProductKitProductListingProductVariationParentProduct),其中包含一个包含所有公共字段的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 | 的表别名ProductTypeStockProduct ]而不是基本产品。所以它引用的列不存在

父对象的公式中是否有等效的this.

nHibernate 每个表类映射,公式引用父操作前

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

您应该在基类中使用它:

UseUnionSubclassForInheritanceMapping();

这在子类映射中:

Abstract();

但是,我认为您正在尝试实现每种类型的表

有关三种不同映射策略的良好解释,请参阅本文: http://www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat