2014-08-28 4 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으로 정의하려고 시도했지만, nhibernate가 ID 매핑을 찾지 못했습니까?

+0

을 어디'놀이에 와서 Cake'는 무엇입니까? 다른 두 테이블과 동일한 테이블에 있습니까? 아니면 별도 테이블에 있습니까? –

+0

'Cake'는 기본 클래스 일 뿐이며 공통 속성을 가지고 있으며 별도의 "CAKE"테이블에 저장됩니다. –

+0

사실 FNH에서 이것이 가능하다는 확신이 없습니다. 'Subclass <>'매핑을 사용하여 무언가를 매핑하면'CheeseCakeMap'에서 필요한 DiscriminateSubClassesOnColumn 메소드를 얻지 못합니다. –

답변

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()); 
    } 
}