2013-08-28 1 views
0

Fluent NHibernate를 사용하여 파일을 읽고 씁니다. 매핑이NHibernate : 상태 저장 세션과 무 상태 세션은 서로 다른 매핑이 필요합니다.

public class ParentMappings: ClassMap<Parent> 
{ 
    public ParentMappings() 
    { 
     Table("Parent"); 
     Id(x => x.Id).Column("Parent_Id"); 
     ... 

     HasMany(x => x.Children) 
      .Not.KeyNullable() 
      .Not.Inverse() 
      .KeyColumn("Parent_Id") 
      .Cascade.All(); 

     ... 
    } 
} 

public class ChildMappings : ClassMap<Child> 
{ 
    public ChildMappings() 
    { 
     Table("Child"); 
     Id(x => x.Id).Column("Child_Id"); 

     Map(x => x.ParentId).Column("Parent_Id"); 
     ... 
    } 
} 

에 의해 정의와 함께 순간, 나는 여기에 문제가, 부모 - 자식 관계를 가지고있다. 속도를 유지하기 위해 상태 저장 세션을 사용하여 부모/자식 테이블에 쓸 수 있기를 원하지만 Stateful 세션으로 테이블에서 읽으므로 Children 컬렉션이 올바르게로드됩니다. 그러나 두 가지 접근 방식은 양립 할 수없는 것으로 보인다. HasMany()을 호출하면 스탯리스 쓰기가 중단됩니다. 제거하면 상태 저장 읽기가 중단됩니다.

더 넓은 의미에서 스테이트 풀 세션을 사용하여 데이터베이스에 쓰고 싶은 경우도있을 수 있습니다. 그러나이 경우 Map(x => x.ParentId).Column("Parent_Id") 문을 포함하면 상태 기록을 깨뜨릴 수 있습니다.

스테이트 풀 세션과 스테이트리스 세션에 대해 서로 다른 매핑을 사용해야하는 것처럼 보입니다. 그러나, 나는 NHibernate에 익숙하지 않으며,이 단계에서이를 수행하는 명백한 방법을 볼 수 없다. 누구든지이 작업을 수행 할 수있는 방법이나 이에 상응하는 해결 방법을 제안 할 수 있습니까?

답변

2

하위 참조를 하위 항목의 상위 항목에 매핑했지만 id 항목이 아닌 참조 항목이어야합니다.

// in childmap 
Reference(x => x.Parent).Column("Parent_Id"); 

로 변경하고 당신은

// in parentmap 
HasMany(x => x.Children) 
     .Not.KeyNullable() 
     .Inverse() 
     .KeyColumn("Parent_Id") 
     .Cascade.All(); 

는 다음 HasManyMap(x => x.ParentId)이 상태 세션에서 더 이상

+0

뛰어난 답을 충돌하지 않는 성능을 향상시키기 위해 역을 설정할 수 있습니다 - 많은 감사를. –