2010-03-16 6 views
4

나는 NHibernate에 익숙하지 않으며이 클래스 내에서 다음 관계를 매핑하는 데 문제가있다. 각 범주가 상위 범주가있을 수 있습니다Fluent/NHibernate 같은 클래스의 컬렉션

public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 

     References(x => x.ParentCategory) 
      .Nullable() 
      .Not.LazyLoad(); 

     HasMany(x => x.SubCategories) 
      .Cascade.All(); 

    } 
} 

public class Category : IAuditable 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name{ get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public virtual IList<Category> SubCategories { get; set; } 

    public Category() 
    { 
     this.Name = string.Empty; 
     this.SubCategories = new List<Category>(); 
    } 

} 

클래스지도 (이 실질적으로 추측되고 있지만), 일부 카테고리 등 등 내가 제대로 저장하는 카테고리를 얻을 수 많은 하위 범주가 (올바른 하위 범주와 상위 범주 fk가 데이터베이스에 있음)로드 할 때 부모 범주로 자신을 반환합니다.

나는 클래스 매핑을 위해 Fluent를 사용하고 있지만 누군가가 올바른 방향으로 나를 가리킬 수 있다면 NHibernate는 올바르게 동작 할 것이다.

+0

오토 맵핑 중이거나 클래스 맵을 정의 했습니까? 클래스 맵을 사용하는 경우 맵핑을 게시 할 수 있습니까? – snicker

+0

좋아, 나는 그들이 가까운지 확실하지 않지만 클래스 맵으로 업데이트했다. –

+0

반대면 중 하나? – Paco

답변

2

그래, HasMany(x=>x.SubCategories)Inverse()을 호출 체인에 추가해야하며 부모 카테고리의 매핑이 주어진 경우 "ParentCategoryId"라고 가정하고있는 열 이름도 지정해야합니다. 물론 이것은 규칙에 따라 다릅니다. .

테이블 구조를 게시하려면 완전한 솔루션을 제공 할 수 있습니다.

+0

Chris, 나는 Hibernate로 하여금 수정없이 데이터베이스 구조를 만들도록 허락합니다. Id, Name, ParentCategoryID 및 CategoryID 열을 만들었습니다. 마지막 두 열은 항상 일치합니다. inverse를 추가하고 결과를 봅니다. –

+0

업데이트 : 생성 된 SQL이 다르더라도 Inverse는 효과가 없지만 결과는 동일하게 유지됩니다. 인서트 측의 SQL은 Inverse()를 사용하면 더 정확하지만 하위 카테고리는 여전히 올바르게로드되지 않습니다. SQL이 올바른 FK를 사용하지 않는 것처럼 보입니다. 필자가 추측하는 바로는, 필자가 제안한대로 열 이름을 알아야한다는 의미인데, Fluent로 그 이름을 지정하는 방법을 모르겠다. –

+1

'HasMany (...). KeyColumn ("ParentCategoryId") ... ' –

4

일반적으로 Fluent NHibernate는 "Category_Id"를 외래 키 열로 간주합니다. "ParentCategoryId"열을 파악하지 못합니다. 자체 참조 열의 이름을 "Category_Id"로 변경하지 않는 한 상위 및 하위 관계에 대한 열 이름을 명확히해야합니다.

참조 열이 null 인 부모 (절대 부모 범주)가없는 범주의 경우 열심히로드를 선택했기 때문에 NHibernate에서 처리하는 방법에 따라 부모 또는 null로 자신을 반환하는 것이 합리적입니다.

public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 

     References(x => x.ParentCategory) 
      .Column("ParentCategoryId") // Many-To-One : parent 
      .Nullable() 
      .Not.LazyLoad(); 

     HasMany(x => x.SubCategories) 
      .Cascade.All().Inverse().KeyColumn("ParentCategoryId"); //One-To-Many : chidren 

    } 
} 
+0

이 솔루션은 잘 쓰여졌으므로 +1을 드리겠습니다. References 측면에서 지정하지 않으면 nHibernate가 ParentCategory_Id를 찾고 있으므로 키 열을 포함하도록 HasMany를 업데이트했습니다. 어느 쪽이든 제대로 작동하는 것처럼 보이지만 특별히 말하기를 좋아합니다. –

관련 문제