2011-09-26 9 views
1

동일한 클래스 (엔티티) 유형의 자식을 가질 수있는 부모가 두 개인 데이터 구조가 있습니다.동일한 자식 엔티티를 가진 다중 부모 NHibernate 참조 - 대 - 부모

public class Parent1 : BaseParent 
{ 
    public Parent1() 
    { 
     Childs1 = new List<Child>(); 
    } 
    public virtual IList<Child> Child1 { get; set; } 
} 

public class Parent2 : BaseParent 
{ 
    public Parent2() 
    { 
     Childs2 = new List<Child>(); 
    } 
    public virtual IList<Child> Child2 { get; set; } 
} 

public class Child 
{ 
    public virtual BaseParent Parent { get; set; } 
} 

하위 항목은 컬렉션에 속한 상위 항목에 대한 참조가 있어야합니다. 즉, Child가 Parent1.Childs1의 컬렉션에 있으면 Child.Parent는 Parent1을 참조해야합니다. Child가 Parent2.Childs2 컬렉션에 있으면 Child.Parent는 Parent2를 참조해야합니다.

나는

public class Parent1Map: ClassMap<Parent1> 
{ 
    public Parent1Map() 
    { 
     Table("PARENT1"); 
     : 
     HasMany<Child>(x => x.Child1).KeyColumn("PARENT1REF"); 
    } 
} 

public class Parent2Map: ClassMap<Parent2> 
{ 
    public Parent2Map() 
    { 
     Table("PARENT2"); 
     : 
     HasMany<Child>(x => x.Child1).KeyColumn("PARENT2REF"); 
    } 
} 

public class ChildMap: ClassMap<Child> 
{ 
    public ChildMap() 
    { 
     Table("CHILD"); 
     : 
     References<Parent1>(c => c.Parent).Column("PARENT1REF"); 
     References<Parent2>(c => c.Parent).Column("PARENT2REF"); 
    } 
} 

으로 시도하지만이 작동하지 않습니다. 오류가 발생했습니다 이미 추가 된 경우 many-to-one 'Parent'를 추가하려고 시도했습니다..

매핑을 어떻게 수행하여 하위 참조를 부모 데이터베이스에서 올바르게로드 할 수 있습니까?

답변

1

나는 비슷한 문제가있어서 레퍼런스와 함께 갔다. 아동이 둘 이상의 컬렉션에없는 경우에만 적용됩니다.

// ChildMap 
ReferencesAny(result => result.Parent) 
    .EntityTypeColumn("discriminator") 
    .EntityIdentifierColumn("Parent_id") 
    .IdentityType<long>() 
    .AddMetaValue<Parent1>("parent1") 
    .AddMetaValue<Parent2>("parent2"); 


// parent1map 
HasMany(part => part.Childs) 
    .Where("discriminator = 'parent1'");