0

트리 구조 모델 (복합 패턴 사용)이 있습니다.
그것의 클래스 다이어그램은 다음과 같이이다 : composite class diagramFluent Nhibernate를 사용하여 간단한 트리를 유지

데이터베이스 다이어그램 : 나무의 database diagram

및 샘플 : enter image description here

나는 그것의 깊이가 더있다 CombatElement 트리를 지속 할 문제 상승 하나 이상의, 내가 그런 객체를 유지하려고 할 때, NHibernate는 1 레벨에있는 객체만을 저장하고 2 레벨 객체에 연결된 객체를 무시하므로 :

나는이 나무 작성하는 경우 :

CombatElement fe = new Formation() { Name = "Alpha Company" }; 

     fe.Add(new Soldier() 
     { 
      Name = "Joe", 
      Rank = 1 
     }); 
     fe.Add(new Soldier() 
     { 
      Name = "Jack", 
      Rank = 2 
     }); 

     CombatElement platoon = 
      new Formation(); 
     platoon.Name = "1st Platoon"; 
     fe.Add(platoon); 
     platoon.Add(
      new Soldier() 
      { 
       Name = "Adam", 
       Rank = 2 

      }); 
     platoon.Add(
      new Soldier() 
      { 
       Name = "Arthur", 
       Rank = 3 

      }); 

은 "조", "1 소대가"와 "잭은"데이터베이스와 "아서"와 "아담"으로 저장됩니다 1 소대의 subelemnts 있습니다 무시되고 저장되지 않을 것입니다 !!

public class CombatElementMap:ClassMap<CombatElement> 
{ 
    public CombatElementMap() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Name).Not.Nullable().Length(100); 
    } 

} 

///////////////////////////

public class FormationMap:ClassMap<Formation> 
{ 
    public FormationMap() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     HasMany(x => x.Elements).Cascade.AllDeleteOrphan(); 
    } 
} 

: 여기

매핑 클래스입니다 ///////////////////////////

public class SoldierMap:ClassMap<Soldier> 
{ 
    public SoldierMap() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Rank); 
    } 
} 

나는 형성 오브젝트를 캐스케이드,하지만 문제는 여전히 유지됩니다. 왜 이런 일이 발생합니까? 그것은 단지 나를 혼란스럽게했다!!

답변

1

당신은 기본적으로

사용한다 조금 어쩌면 개체를 당신은 당신의 매핑을 다시 정의해야 제대로 nHibernate 수 instrcut 기본 클래스와 하위 클래스 속성을 저장하는 클래스 구조에서 상속을 것이다 사용하고있다 SubClassMap 대신 모든 하위 클래스에 대해 ClassMap을 입력하고 해당 하위 클래스 매핑에 새 속성 만 정의하십시오.

나는

public abstract class CombatElement 
{ 
    public CombatElement() 
    { 
     Elements = new List<CombatElement>(); 
    } 

    public virtual Guid Id { get; set; } 

    public virtual string Name { get; set; } 

    public virtual IList<CombatElement> Elements { get; set; } 

    public virtual void Add(CombatElement element) 
    { 
     Elements.Add(element); 
    } 
} 

public class Formation : CombatElement 
{ 
} 

public class Soldier : CombatElement 
{ 
    public virtual int Rank { get; set; } 
} 

그리고 새로운 매핑은 다음과 같이 보일 것이다 (다이어그램에 따라 추측) 일부 요소에 대한 코드를 추가 한 :

또한
public class CombatElementMap : ClassMap<CombatElement> 
{ 
    public CombatElementMap() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Name).Not.Nullable().Length(100); 
     HasMany(x => x.Elements) 
      .AsBag() 
      .Fetch.Join() 
      .Cascade.AllDeleteOrphan(); 
    } 

} 

public class FormationMap : SubclassMap<Formation> 
{ 
    public FormationMap() 
    { 
     //Id(x => x.Id).GeneratedBy.GuidComb(); 
    } 
} 

public class SoldierMap : SubclassMap<Soldier> 
{ 
    public SoldierMap() 
    { 
     //Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Rank); 
    } 
} 

있는지 확인 당신은 .Flush 전화 엔터티를 저장 한 후에는 데이터베이스에 저장되지 않을 수 있습니다.

session.Save(fe); 
session.Flush(); 
+0

당신은 나의 구세주입니다. 저는 이것을 해결하기 위해 많은 시간을 할애했지만 아무런 문제가 없습니다. SqlServer의 데이터베이스 다이어그램도 변경되었습니다. 고마워. –

+0

@HashemAboonajmi 환영합니다;) – MichaC

+0

또한 AutoMapping으로이를 해결하려고했습니다. AutoMapper는 GetEumerator() 메서드를 엔터티로 취급하며이 메서드에 대한 불만에는 매핑 된 Id가 없습니다! 여기에 질문에 대한 링크가 있습니다 : http://stackoverflow.com/questions/19189185/automapping-a-composite-model-with-composite-iteration-with-fluentnhibernate이 문제에서도 저를 도울 수 있다면 감사하겠습니다. –