2015-01-23 2 views
0

코드로 매핑 된 테이블 당 구조체 구조와 데이터가있는 테이블 - 116 행이 있습니다. 처음에이 테이블 (및 전체 데이터베이스)은 Entity Framework Code First 접근 방식을 사용하여 만들어졌습니다. 내가 EF에서 NH로 전환하는 몇 가지 이유로 인해 위에서 언급 한 테이블 결과에서 115 개의 올바르게 생성 된 객체에 데이터를 가져 오려고 시도하고 하나의 단일 행으로 인해 잘못된 기본 유형의 프록시 객체가 생성됩니다. 다른 유사한 행과 결함이있는 행 (동일한 Discriminator 값이있는 30 개의 행) 사이에 차이점을 찾으려고했지만 실패했습니다. 따라서 질문은 - 내 문제를 해결하기 위해 어떤 디버그 기술을 사용할 수 있습니까?nHibernate - TPH 객체 생성을 디버깅하는 방법이 있습니까?

나는 테이블에서 데이터를로드하는 방법을 작은 조각 아래

:

var more = _dbSession.Query<BaseTreeNode>() 
 
       .Where(tn => !tn.IsTemplate) 
 
       .OrderBy(tn => tn.Id) 
 
       .ToList();

그리고 이것은 매핑 :

public class BaseTreeNodeMapping : ClassMapping<BaseTreeNode> { 
 
     public BaseTreeNodeMapping() { 
 
      Debug.WriteLine("{0}", GetType()); 
 
      Table("BaseTreeNodes"); 
 
      Id(x => x.Id); 
 

 
      Discriminator(x => { 
 
       x.Force(true); 
 
       x.Formula("arbitrary SQL expression"); 
 
       x.Insert(true); 
 
       x.Length(128); 
 
       x.NotNullable(true); 
 
       x.Column("Discriminator"); 
 
      }); 
 

 
      Property(p => p.Name); 
 
      Property(x => x.SortOrder); 
 
      Property(x => x.IsTemplate); 
 
      Property(x => x.ArchiveUid); 
 
      Property(x => x.LastChangedAt, x => x.Lazy(false)); 
 
      Property(x => x.LastChangedBy); 
 

 
      // Complex Properties 
 
      ManyToOne(x => x.Parent, p => { 
 
       p.Column("Parent_Id"); 
 
       p.Class(typeof(BaseTreeNode)); 
 
       p.NotNullable(false); 
 
      }); 
 
      ManyToOne(x => x.ComplexNode, cn => { 
 
       cn.Column("ComplexNode_Id"); 
 
       cn.NotNullable(true); 
 
      }); 
 
      ManyToOne(x => x.ComplexStructure, cn => { 
 
       cn.Column("ComplexStructure_Id"); 
 
       cn.NotNullable(true); 
 
      }); 
 
      ManyToOne(x => x.ContentNode, cn => { 
 
       cn.Column("ContentNode_Id"); 
 
       cn.NotNullable(true); 
 
      }); 
 
     } 
 

 
     public class EntityMapping : SubclassMapping<Entity> { 
 
      public EntityMapping() { 
 
       DiscriminatorValue("Entity"); 
 
       ManyToOne(p => p.TypeCode, t => { 
 
        t.Column("TypeCode_Id"); 
 
        t.Class(typeof(TypeCode)); 
 
        t.Fetch(FetchKind.Join); 
 
        t.NotNullable(true); 
 
        t.Lazy(LazyRelation.NoLazy); 
 
       }); 
 
       Property(p => p.ArchivedFrom); 
 
      } 
 
     }

답변

0

이유는 (첫 번째 행) 하나의 첫 번째 행의 부모 속성을 통해 프록시 개체를 참조하는 때문에 basetype 있고 열심히 반입되지 않습니다 NHibernate 경우에만이를 나타내는이 basetype 프록시를 만들 수 있기 때문에 이유입니다. 나중에 행과 동일한 객체를 찾아서 기존 참조 (프록시)를 넘깁니다.

ManyToOne(x => x.Parent, p => { 
      p.Column("Parent_Id"); 
      p.Class(typeof(BaseTreeNode)); 
      p.Lazyload(false); 
      p.NotNullable(false); 
     }); 
:

쉽게 수정 Parent 속성에 대한 LazyLoading을 비활성화하는 것입니다

관련 문제