1

私が取り組んでいるプロジェクトでは、タブを使用しています。これらのタブにはコンテンツがあります。複数のコンテンツ オブジェクトを 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 が返される理由がわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

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 は 1 つのマップにのみ必要でした。また、タブを親にしました。

タブを削除するには:

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

この構成では、タブのコンテンツが希望どおりに並べられます。並べ替えは、更新、追加、削除時に nHibernate によって自動的に更新されます。

于 2010-08-02T17:21:59.463 に答える