在列表中重新排序项的正确方法(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>());  

在列表中重新排序项的正确方法(nhibernate)

我认为您正在使用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; }