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