2014-08-28 70 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()); 
    } 
} 
相關問題