Как я могу гарантировать, что NHibernate создает прокси IList? - PullRequest
1 голос
/ 06 января 2010

У меня есть свойство в моем доменном объекте, которое отображается как:

    public virtual IEnumerable<WorkPost> WorkPosts
    {
        get { return sheetPosts; }
        private set
        {
            Guard.AssertAssignableFrom(value, typeof (IList<WorkPost>));
            sheetPosts = value as IList<WorkPost>;
        }
    }

Внутренним представлением является IList<WorkPost>, и, как вы можете видеть, назначенное значение (это ленивый загрузочный прокси-сервер из NHibernate) затем приводится к правильному типу. Эта реализация дала мне неприятный вкус, потому что это зависит от внутреннего представления прокси-серверов NHibernate. Чтобы убедиться, что NHibernate генерирует прокси как список, я создал свободное отображение для свойства с объявлением AsList():

        HasMany(sheet => sheet.WorkPosts).KeyColumn("sheetId").AsList();

Но это дало мне немного больше, чем требовалось, потому что семантика списка подразумевает сортировку, которая снова добавляет некоторые дополнительные поля в модель базы данных, а также некоторые дополнительные запросы (из-за обновления поля сортировки при фиксации), так что выше " AsList "должен уйти.

Как я могу контролировать, какой тип интерфейсов должен возвращать NHibernate при генерации прокси? (примечание: изменение типа возврата IEnumerable для свойства не является ответом, который я ищу: -))

1 Ответ

1 голос
/ 06 января 2010

Если вы не хотите сортировать семантику, вы должны использовать набор или сумку, в зависимости от того, допускаете ли вы повторяющиеся элементы или нет. Вот документация для коллекций для получения дополнительной информации.

NHibernate очень строг по семантике коллекций:

  • список (сохраняется IList) - упорядоченная коллекция, которая допускает дубликаты и может быть проиндексирована целыми числами;
  • карта (сохраняется IDictionary) - неупорядоченная коллекция, которая индексируется уникальными ключами заданного типа;
  • набор (сохраняется ISet из Iesi.Collections, вероятно, будет использовать ISet, поставляемый с версией 4 платформы) - неупорядоченная коллекция, которая не допускает дублирование.
  • сумка (сохраняется ICollection или IList, но не дает никаких гарантий для индексации) - неупорядоченная коллекция, которая допускает дублирование.
...