Fluent nHibernate使用AsList()返回空对象,具体取决于排序器

Fluent nHibernate使用AsList()返回空对象,具体取决于排序器,nhibernate,many-to-many,fluent,Nhibernate,Many To Many,Fluent,在我正在从事的一个项目中,我们使用的是选项卡。这些选项卡包含内容。一个选项卡上可以有多个内容对象。所以我们可以有一个“car”选项卡,car选项卡可以显示一个sedan内容对象、一个suv内容对象和一个truck内容对象。用户还可以指定它包含更多或更少的这些对象,并根据需要对它们进行排序。对于我们来说,按照用户规范维护这些内容对象的顺序是很重要的 以下是我的映射: 在“映射”选项卡上: HasManyToMany(t => t.ContentObjects) .T

在我正在从事的一个项目中,我们使用的是选项卡。这些选项卡包含内容。一个选项卡上可以有多个内容对象。所以我们可以有一个“car”选项卡,car选项卡可以显示一个sedan内容对象、一个suv内容对象和一个truck内容对象。用户还可以指定它包含更多或更少的这些对象,并根据需要对它们进行排序。对于我们来说,按照用户规范维护这些内容对象的顺序是很重要的

以下是我的映射:

在“映射”选项卡上:

    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")); 
在ContentObject映射上:

    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 塔比德 ContentObjectId 排序器int不为空

我可以添加内容对象,在 tab,一切都很好。nHibernate正在添加/更新排序器 适当地。当我试图删除一个内容时,问题出现了 对象当我要从此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); 
} 
                foreach (Tab tab in deleteContentObject.Tabs)
                {
                    tab.ContentObjects.Remove(deleteContentObject);
                }
//需要通过contentObject删除每个,因为它是父对象
foreach(deleteContentObject.Tabs中的选项卡)
{ 
tab.RemoveContentObject(deleteContentObject);
} 
//在选项卡类中
公共虚拟void RemoveContentObject(TabContentObject项)
{ 
如果(ContentObjects==null)ContentObjects=new List();
ContentObjects.Remove(项);
} 
如果它是选项卡中唯一的或第一个(SortOrder=0)contentObject,我可以删除它。如果是第二个内容对象,则contentObject.Tabs看起来像[0][null]、[1][Tab]。如果它是选项卡上的第四个contentObject,则contentObject.Tabs看起来像[0][null],[1]
[null]、[2][null]、[3][Tab]。因此,根据关联表中的SortOrder列,我似乎返回了许多空引用,因此由于空引用而无法删除。我不明白为什么会返回这些空值。任何帮助都将不胜感激。

我已通过以下方式解决此问题:

选项卡映射:

        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。我还将选项卡设置为父选项卡

要删除选项卡,请执行以下操作:

            //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); 
} 
                foreach (Tab tab in deleteContentObject.Tabs)
                {
                    tab.ContentObjects.Remove(deleteContentObject);
                }

通过这种配置,选项卡的内容按我们希望的方式排序。nHibernate会在更新、添加和删除时自动更新排序。

我已通过以下方法解决了此问题:

选项卡映射:

        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。我还将选项卡设置为父选项卡

要删除选项卡,请执行以下操作:

            //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); 
} 
                foreach (Tab tab in deleteContentObject.Tabs)
                {
                    tab.ContentObjects.Remove(deleteContentObject);
                }
通过这种配置,选项卡的内容按我们希望的方式排序。nHibernate在更新、添加、删除时自动更新排序