私が取り組んでいるプロジェクトでは、タブを使用しています。これらのタブにはコンテンツがあります。複数のコンテンツ オブジェクトを 1 つのタブに配置できます。したがって、「車」タブを作成すると、その車タブには、セダン コンテンツ オブジェクト、suv コンテンツ オブジェクト、およびトラック コンテンツ オブジェクトが表示される場合があります。ユーザーは、これらのオブジェクトを多かれ少なかれ含むように指定し、必要に応じて並べ替えることもできます。これらのコンテンツ オブジェクトの順序をユーザーの指定に従って維持することが重要です。
ここに私のマッピングがあります:
タブのマッピング:
HasManyToMany(t => t.ContentObjects)
.Table("TabContentObjects")
.ParentKeyColumn("TabID")
.ChildKeyColumn("ContentObjectID")
.AsList(index => index.Column("SortOrder"));
ContentObject マッピング:
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 が奇妙に見えます。
タブを削除するために使用するコードは次のとおりです。
//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);
}
それが唯一の、またはタブ内の最初の (SortOrder = 0) contentObject である場合は、削除できます。2 番目のコンテンツ オブジェクトの場合、contentObject.Tabs は [0] [null]、[1] [Tab] のようになります。タブの 4 番目の contentObject の場合、contentObject.Tabs は [0] [null]、[1] [null]、[2] [null]、[3] [Tab] のようになります。そのため、関連付けテーブルの SortOrder 列の内容によっては、多くの null 参照が返されているようで、null 参照のために削除できません。これらの null が返される理由がわかりません。どんな助けでも大歓迎です。