Правильный способ переупорядочения элементов в списке (nhibernate) - PullRequest
2 голосов
/ 10 июля 2011

Как правильно изменить порядок списка при использовании NHibernate?

Это мой список:

    private IList<MediaItem> media = new List<MediaItem>();
    public virtual IList<MediaItem> Media { get { return media.ToReadOnlyCollection(); } }

И я изменяю порядок, передав упорядоченный список MediaItemids (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Список (не набор или сумка), чтобы индекс предметов был постоянным.

Вот отображение коллекции MediaItem на Project.MediaItem не имеет ссылки на проекты.Отношения многие ко многим.

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

1 Ответ

0 голосов
/ 10 июля 2011

Я думаю, что вы используете 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; }
...