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

时间:2011-07-10 17:30:21

标签: c# .net nhibernate html-lists

使用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),以便持久保存项目的索引。

以下是MediaItemProject集合的映射。 MediaItem没有提及项目。这种关系是多对多的。

        HasManyToMany(p => p.Media)
            .Table("PortfolioProjectMedia")
            .Access.CamelCaseField()
            .ParentKeyColumn("ProjectId")
            .ChildKeyColumn("MediaItemId")
            .Cascade.SaveUpdate()
            .AsList(i => i.Column("ListIndex").Type<int>());  

1 个答案:

答案 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; }