2013-07-09 2 views
4

В чем разница между использованием IList, IEnumerable, ISet или ICollection для коллекций дочерних объектов в классах сущностей NHibernate? То есть:В чем разница между использованием IList, IEnumerable, ISet или ICollection в NHibernate?

public class Parent 
{ 
    public virtual int IdParent { set; get; } 

    public virtual IList<Child> Childs { set; get; } 
    // Or 
    public virtual ISet<Child> Childs { set; get; } 
    // Or so on... 
} 

ответ

11

IList

  • двунаправленная связь: НЕ ПОДДЕРЖКЕ. (Так как есть дополнительный столбец индекса, который вводится для поддержания порядка детей, которых ребенок элемент не может смысл)
  • упорядоченного: Да
  • Тип: IList
  • Дубликаты: Разрешенные
  • О внесении element: вся коллекция будет загружена, чтобы получить значение столбца индекса. Избегайте, если список детей огромен.

Сумки

  • двунаправленная связь: Поддерживаемые
  • Заказанный: НЕТ
  • Тип: IList
  • Дубликаты: Разрешенные
  • На Добавление элемента: только один удар в базу данных , Нет проблем с производительностью.

ISet

  • Двунаправленная связь: Поддерживаемые
  • Упорядоченный: НЕТ
  • Тип: ISet (до NHibernate 3.0 она поддерживает интерфейс от Iesi.Collections)
  • Duplicates: НЕ РАЗРЕШЕНО
  • На Добавление элемента: сбор всего будет загружен, чтобы проверить наличие дубликатов. Избегайте, если список детей огромен.

ICollection может быть использован как тип коллекции ребенка, которые могут быть отображены на любом из трех NHibernate Отображения

Nhibernate Cookbook 3,0 имеет хорошие объяснения использования каждого из коллекции, на всяком случае, если вы случается, сталкиваются с этим.

+2

Я бы использовал 'ICollection ' для мешков. 'IList ' подразумевает, что есть заказ и индекс, который это не относится к мешкам. – cremor

+1

Не могли бы вы расширить IList, не поддерживающий двунаправленные отношения. У нас есть все наши коллекции, которые были показаны как IEnumerable как свойство и IList в качестве области поддержки, и у нас нет НИКАКИХ проблем с двунаправленными отношениями, что так всегда , – epitka

1

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

Если это не так, и вы действительно хотите, чтобы вы не перечислили коллекцию более одного раза, вы сделали бы ее доступной как IList, ISet или ICollection. IList будет предпочтительнее, если вы захотите убедиться, что коллекция может иметь дубликаты, тогда как ISet предпочтительнее, если вы хотите, чтобы в наборе не было обмановки (заданное поведение было более полезным в моем опыте).

Как IList, так и ISet являются ICollections, который раскрывает поведение коллекции костей, таких как Count. В контексте NHib вы можете увидеть это в реализациях, где используются коллекции Iesi вместо .net HashSet, но это скорее связано скорее с тем, что когда-то не было .net HashSet, а затем произошло отставание в способности NHib использовать его легко (но NHib мог бы иметь возможность отображать ICollection в набор Iesi).

НТН

+1

«Любое IEnumerable означает отсроченное исполнение» не соответствует действительности. Все коллекции являются IEnumerable. Ничто не говорит против использования свойств IEnumerable для коллекций, отображаемых как набор или сумка, если вам никогда не нужно изменять коллекцию. – cremor

+1

@cremor. технически верно, но это все равно будет основной причиной для того, чтобы представить коллекцию как таковую, ИМО. Я изменил формулировку «средства» на «означает, что вы хотите». Слова * важны: -) – Berryl

Смежные вопросы