2014-08-28 64 views
0

我使用功能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> { 

} 

我想要的是拥有两个CheeseCakeVanillaCheeseCake同一张桌子。 Cake.CakeType可以用作判别器。我也尝试将VanillaCheeseCakeMap定义为CakeMap的ClassMap,但是然后nhibernate找不到ID映射?

+0

那么,这是否'Cake'发挥作用?与其他两个人在同一张桌子上,还是在另一张桌子上? – 2014-08-28 18:02:20

+0

'Cake'只是一个基类,它有一些共同的属性,并被存放在一个单独的“CAKE”表中。 – 2014-08-29 06:35:11

+0

我其实不确定这是可能的与FNH。如果使用Subclass <>映射映射某些内容,则不会得到''CheeseCakeMap''所需的'DiscriminateSubClassesOnColumn'方法。 – 2014-08-29 13:37:56

回答

0

我会改变的模式有一个表的所有蛋糕种类和对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()); 
    } 
}