使用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列表(不是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>());
答案 0 :(得分:0)
我认为您正在使用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; }