2011-01-28 4 views
0

로 기존 테이블 주위 어색 값을 근무하고 내가 존재하지 않는 무언가를 표현하기 위해 0 대신 NULL의 값을 사용하는 기존 테이블에 참여하기 위해 노력하고있어.난 그냥 NHibernate에 함께 시작 해요 NHibernate에

데이터베이스에 id가 0 인 행이 있습니다.이 행은 단순히 자리 표시 자일뿐입니다.

이 자리 표시자를 검색하는 것을 피하고 대신 내 속성을 null으로 지정하고 싶습니다.

나는 다시 null과에 0의 값을 매핑 처리하는 IUserType을 시도했지만 I'don't는 대일가 ( .References()) 매핑 사용자 정의 유형의 작업을 생각합니다.

public class Category 
{ 
    public virtual int Id { get; set; } 
    public virtual string CategoryName { get; set; } 

    public virtual Category Parent { get; set; } 

    public virtual IList<Category> Children { get; set; } 

    public virtual Category RealCategory { get; set; } 

    public virtual bool IsHomeParent { get; set; } 
} 

이 매핑은 다음과 같습니다 : 그래서

public class CategoryMapping:ClassMap<Category> 
{ 
    public CategoryMapping() 
    { 
     Id(x => x.Id); 

     Map(x => x.CategoryName); 


     Join("categorymappings", 
      m => 
       { 
        m.KeyColumn("categoryid"); 
        m.Map(z => z.IsHomeParent); 
        // need ids of 0 to come up as null for .Parent 
        m.References(z => z.Parent).Column("parentcategoryid"); 
        m.References(z => z.RealCategory).Column("realcategoryid").Not.LazyLoad(); 
        m.Optional(); 
       }); 

     HasManyToMany(p => p.Children) 
      .Table("categorymappings") 
      .ParentKeyColumn("parentcategoryid") 
      .ChildKeyColumn("categoryid") 
      .Where("ishomeparent=0") 
      .Fetch.Join() 
      .Not.LazyLoad(); 

     Table("categories"); 
    } 
} 

다시

는 클래스입니다. 0의 ID는 null이되도록 .Parent을 얻으려고합니다.

관련 참고 사항에서 피할 필요가있는 레거시 데이터베이스의 데이터에 대한 무한 재귀 문제가 있습니다. 카테고리가 최상위 레벨 일 때

categoryid는 매핑 테이블에 parentcategoryid (예. categoryid=1, parentcategoryid=1)와 동일하다.

내게 동일한 개체를 계속 참조하는 .Parent property이 표시됩니다. (따라서 .Parent.Parent.Parent.Parent.etc은 같은 객체 임).

NHibernate는 결국 포기할 정도로 영리한 것처럼 보이지만 상당히 느려지고 있습니다.

따라서, 이상적으로 매핑하는 방식으로 정의되어야 그 중 하나 parentcategoryid=categoryid 또는 parentcategoryid=0 경우 .Parent 열이 무시됩니다 (null로 설정)합니다.

Fluent 매핑을 통해이 작업을 수행 할 수 있습니까?

답변

2

가능하다면, 두 번째 문제에 대한 0

의 ID와 함께 행 걸러 전용 필드로 부모 오브젝트를 매핑하고 아래의 예처럼 노출하는 도면을 사용한다. 객체와 부모가 동일한 경우 null 부모를 반환합니다.

+0

이것은 작동하는 것 같습니다. setter에서도 0 문제를 처리 할 수있는 것처럼 보입니다. 그래도 NHibernate를 저장하는 것을 혼란스럽게할지 모르겠다. 나는 그것을 시험해야 할 것이다. – andreialecu