Inheritance 映射到同一个表的两个子类

Inheritance 映射到同一个表的两个子类,inheritance,nhibernate,fluent-nhibernate,Inheritance,Nhibernate,Fluent Nhibernate,我在一个项目中使用Fluent NHibernate,但有一个问题我自己无法解决: class Cake {} class CheeseCake : Cake {} class VanillaCheeseCake : CheeseCake {} class CakeMap : Class<Cake> { Table("CAKE"); Id(x => x.Id, "ID") .GeneratedBy.GuidComb(); Map(x =&g

我在一个项目中使用Fluent NHibernate,但有一个问题我自己无法解决:

class Cake {}
class CheeseCake : Cake {}
class VanillaCheeseCake : CheeseCake {}


class CakeMap :  Class<Cake> {
    Table("CAKE");
    Id(x => x.Id, "ID")
    .GeneratedBy.GuidComb();
    Map(x => x.CakeType);
}

class CheeseCakeMap :  Subclass<CakeMap> {
    Table("CHEESE_CAKE");
    KeyColumn("ID");
    Map(x => x.CheeseAmount);
}

class VanillaCheeseCakeMap :  Subclass<CheeseCakeMap> {

}
类蛋糕{}
奶酪蛋糕类:蛋糕{}
VanillaCheeseCake类:CheeseCake{}
类CakeMap:类{
桌子(“蛋糕”);
Id(x=>x.Id,“Id”)
.GeneratedBy.GuidComb();
Map(x=>x.CakeType);
}
类CheeseCakeMap:子类{
餐桌(“奶酪蛋糕”);
键列(“ID”);
地图(x=>x.1海山);
}
类VanillaCheeseCakeMap:子类{
}

我想要的是把
CheeseCake
vanillachesecake
放在同一张表中
Cake.CakeType
可用作鉴别器。我还尝试将
VanillaCheeseCakeMap
定义为
CakeMap
的类映射,但是nhibernate没有找到ID的映射?

我会将模式更改为所有蛋糕类型都有一个表,并在caketype列上进行区分,但以下内容应该适用于您的建议:

public enum CakeType
{
    Cake,
    CheeseCake,
    VanillaCheeseCake
}

public class Cake
{
    public virtual Guid Id { get; set; }
    public virtual CakeType Type { get; protected set; }
}
public class CheeseCake : Cake
{
    public virtual int CheeseAmount { get; set; }
}
public class VanillaCheeseCake : CheeseCake
{
}

public class CakeMap : ClassMap<Cake>
{
    public CakeMap()
    {
        Table("CAKE");
        Id(x => x.Id, "ID").GeneratedBy.GuidComb();
        Map(x => x.Type, "CakeType").ReadOnly();

        DiscriminateSubClassesOnColumn("CakeType");
    }
}
public class CheeseCakeMap : SubclassMap<CheeseCake>
{
    public CheeseCakeMap()
    {
        DiscriminatorValue(CakeType.CheeseCake.ToString());

        Join("CHEESE_CAKE", join =>
        {
            join.KeyColumn("ID");
            join.Map(x => x.CheeseAmount);
        });
    }
}

public class VanillaCheeseCakeMap : SubclassMap<VanillaCheeseCake>
{
    public VanillaCheeseCakeMap()
    {
        DiscriminatorValue(CakeType.VanillaCheeseCake.ToString());
    }
}
公共枚举CakeType
{
蛋糕,
芝士蛋糕,
香草芝士蛋糕
}
公开课蛋糕
{
公共虚拟Guid Id{get;set;}
公共虚拟CakeType类型{get;protected set;}
}
公营芝士蛋糕:蛋糕
{
公共虚拟海山{get;set;}
}
大众级香草芝士蛋糕:芝士蛋糕
{
}
公共类CakeMap:ClassMap
{
公共CakeMap()
{
桌子(“蛋糕”);
Id(x=>x.Id,“Id”).GeneratedBy.GuidComb();
Map(x=>x.Type,“CakeType”).ReadOnly();
区分子类子列(“CakeType”);
}
}
公共类CheeseCakeMap:子类映射
{
公共芝士蛋糕地图()
{
鉴别器值(CakeType.CheeseCake.ToString());
加入(“奶酪蛋糕”,加入=>
{
join.KeyColumn(“ID”);
join.Map(x=>x.seamount);
});
}
}
公共类VanillaCheeseCakeMap:子类映射
{
公共VanillaCheeseCakeMap()
{
鉴别器值(CakeType.vanillachesecake.ToString());
}
}

那么,
蛋糕
在哪里发挥作用呢?这是与其他两个表在同一个表中还是在一个单独的表中?
Cake
只是一个基类,它有一些共同的属性,存储在一个单独的“Cake”表中。实际上,我不确定FNH是否可能做到这一点。如果使用
子类
映射来映射某个对象,则不会得到
DiscriminateSubClassesOnColumn
方法,这是
CheeseCakeMap
中需要的方法。我尝试了很多方法,但无法使它对两个子类使用一个表。如果我为
vanillachesecake
创建一个单独的表,那么一切都会正常工作,但我确实不喜欢这种db继承(每个类的表),这会降低db的可读性。那么使用一个表来存储所有三个类是一个选项吗?