2010-07-28 4 views
1

현재 진행중인 프로젝트에서 탭을 사용하고 있습니다. 이 탭에는 내용이 있습니다. 여러 콘텐츠 개체는 탭에있을 수 있습니다. 따라서 우리는 '자동차'탭을 가질 수 있으며, 자동차 탭에는 세단 콘텐츠 개체, SUV 콘텐츠 개체 및 트럭 콘텐츠 개체가 표시 될 수 있습니다. 또한 사용자는 이러한 개체가 더 많거나 적게 포함되도록 지정할 수 있으며 원하는대로 주문할 수 있습니다. 이러한 콘텐츠 객체의 순서를 사용자 지정으로 유지하는 것이 중요합니다. ContentObject 매핑에AsList()를 사용하는 Fluent nHibernate는 SortOrder에 따라 null 객체를 반환합니다.

HasManyToMany(t => t.ContentObjects) 
     .Table("TabContentObjects") 
     .ParentKeyColumn("TabID") 
     .ChildKeyColumn("ContentObjectID") 
     .AsList(index => index.Column("SortOrder")); 

:

탭 매핑에

:

HasManyToMany(c => c.Tabs) 
     .Table("TabContentObjects") 
     .ParentKeyColumn("ContentObjectID") 
     .ChildKeyColumn("TabID") 
     .Cascade.SaveUpdate() 
     .AsList(index => index.Column("SortOrder")); 

협회 테이블 인 : 여기

내 매핑이

TabContentObjectId TABID ContentObjectId SortOrder int not null

콘텐츠 개체를 추가하고 탭 내에 콘텐츠 개체를 다시 정렬 할 수 있으며 모두 정상입니다. nHibernate가 SortOrder 을 적절하게 추가/업데이트하고있다. 문제는 콘텐츠 개체를 삭제하려고 할 때 발생합니다. 이 contentObject에서 탭을 삭제하려고하면 contentObject.Tabs가 이상하게 보입니다. 그것이 유일한, 또는 (SORTORDER = 0) 탭에서 contentObject, 내가 삭제할 수 있습니다 첫 번째 경우

  //Need to remove each through the contentObject since it is parent 
      foreach (Tab tab in deleteContentObject.Tabs) 
      { 
       tab.RemoveContentObject(deleteContentObject); 
      } 

//in Tab class 
public virtual void RemoveContentObject(TabContentObject item) 
{ 
    if (ContentObjects == null) ContentObjects = new List<TabContentObject>(); 
    ContentObjects.Remove(item); 
} 

: 여기

내가 탭을 삭제하는 데 사용하는 코드입니다. 두 번째 내용 객체 인 경우 contentObject.Tabs는 [0] [null], [1] [Tab]처럼 보입니다. 탭의 네 번째 contentObject 인 경우 contentObject.Tabs는 [0] [null], [1] [null], [2] [null], [3] [Tab]과 같습니다. 따라서 SortOrder 열이 연관 테이블에있는 지에 따라 많은 null 참조가 반환 된 것처럼 보이므로 null 참조로 인해 삭제할 수 없습니다. 이 null이 반환되는 이유를 알 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

1

나는 다음과 같이이 문제를 해결 한 :

탭지도 :

 HasManyToMany(t => t.ContentObjects) 
      .Table("wfdc_Tab_TabContentObjects") 
      .ParentKeyColumn("TabID") 
      .ChildKeyColumn("ContentObjectID") 
      .Cascade.SaveUpdate() 
      .AsList(index => index.Column("SortOrder")); 

내용 개체지도 :

 HasManyToMany(c => c.Tabs) 
      .Table("wfdc_Tab_TabContentObjects") 
      .ParentKeyColumn("ContentObjectID") 
      .ChildKeyColumn("TabID") 
      .Inverse(); 

그래서 내가 하나의지도에 AsList이 필요했습니다. 나는 또한 Tab을 부모로 만들었다.

는 탭을 제거하려면이 구성

   foreach (Tab tab in deleteContentObject.Tabs) 
       { 
        tab.ContentObjects.Remove(deleteContentObject); 
       } 

는 탭의 내용이 우리가 원하는 방식으로 정렬됩니다. 정렬은 업데이트, 추가, 삭제시 nHibernate에 의해 자동으로 업데이트됩니다.

관련 문제