在列表中重新排序项的正确方法(nhibernate)
本文关键字:nhibernate 方法 排序 列表 新排序 | 更新日期: 2023-09-27 18:01:45
使用NHibernate时重新排序列表的正确方法是什么?
这是我的清单:
private IList<MediaItem> media = new List<MediaItem>();
public virtual IList<MediaItem> Media { get { return media.ToReadOnlyCollection(); } }
我通过传递MediaItem
id (Guid
)的有序列表来重新排序:
public virtual void UpdateMediaOrder(IList<Guid> mediaIds) {
// TODO remove any unmatched items
foreach (var mi in Media)
{
int index = mediaIds.IndexOf(mi.Id);
if (index == -1)
index = media.Count() -1;
media[index] = mi;
}
}
当我重新排序列表时(在这个例子中包含3个项目),NHibernate执行以下操作:
NHibernate: DELETE FROM PortfolioProjectMedia...
NHibernate: INSERT INTO PortfolioProjectMedia...
NHibernate: INSERT INTO PortfolioProjectMedia...
NHibernate: INSERT INTO PortfolioProjectMedia...
我猜我希望看到Updates
而不是清除列表。
是我做错了什么,还是这是预期的行为?
更新如果它还不清楚,我需要将我的列表映射为NHibernate list(不是Set或Bag),以便条目的索引被持久化。
下面是MediaItem
集合在Project
上的映射。MediaItem
没有项目参考。关系是多对多的
HasManyToMany(p => p.Media)
.Table("PortfolioProjectMedia")
.Access.CamelCaseField()
.ParentKeyColumn("ProjectId")
.ChildKeyColumn("MediaItemId")
.Cascade.SaveUpdate()
.AsList(i => i.Column("ListIndex").Type<int>());
我认为您正在使用BAG来映射MediaItem集合。你试过使用SET吗?
试试这样写:
<set cascade="all-delete-orphan" inverse="true" name="Media">
<key>
<column name="Media_id" />
</key>
<one-to-many class="MediaItem" />
</set>
using Iesi.Collections.Generic;
public Media()
{
this.Media = new HashedSet<MediaItem>();
}
public virtual ISet<MediaItem> Media { get; set; }