Відповіді:
NHibernate семантика:
Список: упорядкований збір об'єктів, дозволений дублікат. Використовуйте .NET IList
у коді. Індексний стовпчик потрібно буде відобразити в NHibernate.
Набір: Не упорядкована колекція унікальних об'єктів, копії не дозволені Використовуйте Iesi.Collection.ISet
в коді (NH до v4) або System.Collections.Generic.ISet
(NH v4 +). Важливо переосмислити GetHashCode
та Equals
вказати ділове визначення дубліката. Можна відсортувати, визначивши порядок замовлення або визначивши порівняльник, що призводить до SortedSet
результату.
Сумка: Не упорядкований список об'єктів, дозволені копії. Використовуйте .NET ICollection<T>
у коді. Сторінка індексу списку не відображається та не шанується NHibernate.
Усі ці об’єкти в NHibernate точно такі ж, як і в інших реалізаціях цих абстрактних типів даних (ADT). Мене здивувало, як важко знайти набори та сумки в Інтернеті через те, наскільки поширені назви для інших речей, тому я перерахував тут деякі посилання та описи.
Для отримання більш детальної інформації дивіться наступне: Списки , набори та сумки
Загальні правила:
Списки за замовчуванням упорядковані, використовуйте їх, якщо ви хочете мати можливість витягнути об’єкт за його покажчиком або у вас є дивна прихильність до for
петель над foreach
петлями. Ви не зобов’язані отримувати доступ до них у порядку, як вам потрібно в списку зв'язаних . Цей ADT дозволяє копії.
Будь ласка, запиши! Хоча списки упорядковані так, як згадував BryanD у своїй відповіді, абсолютно нічого не говорить про те, що він повинен бути в тому порядку, який ви очікуєте від бази даних, коли ви будете виконувати запит HQL, якщо ви не вказали замовлення командою. Саме тому деякі люди люблять використовувати набір або сумки замість цього, так що це не дає ілюзії замовлення. Хоча я і кажу про це, більшість часу вони здаються у видимому порядку, оскільки вони додаються до списку в тому порядку, який вони знайшли у запиті, який проводить NHibernate.
Набори є НЕ за замовчуванням впорядковані, ви не можете отримати доступ до будь-якої змінної безпосередньо через індекс. Набори за замовчуванням є єдиним ADT з вищезгаданих трьох, які підтримують унікальність його об'єктів . Вони чудові, якщо у вас є колекція, якщо вам потрібно не містити дублікатів.
Мішки (або мультисети ) - це, як видно з посилань вище, тип набору, який дозволяє об'єктам, що знаходяться в ньому, бути дублікатами інших об'єктів. Вони, як правило, не використовуються, оскільки замовлення списків можна ігнорувати, а отже, трактувати як Сумка.
Що стосується того, як вони використовуються в NHibernate, з бази даних нічого не витягується по-різному, залежно від того, який ADT ви вибрали тут, саме те, що ви хочете використовувати для цього, повинно змусити вас вибрати інший ADT.
Особисто я використовую набори для більшості речей, оскільки я, як правило, вимагаю, щоб дочірні об’єкти були унікальними, і замовлення - це не проблема. Хоча я буду використовувати Списки, де у мене є група об'єктів, які я хочу замовити чимось, наприклад, часом, щоб досягти цього порядку, мені потрібно вручну встановити "порядок" у запиті HQL.
Ну а головна відмінність полягає в тому, що списки мають неявне впорядкування елементів, індексоване їх положенням у списку. Набори та сумки також можуть бути «замовлені» компаратором або наказом за умовами, які застосовуються, коли ці елементи виходять із БД. Особисто я ніколи не використовував Сумки ... якщо я знаю, що потрібні мені дані впорядковуються послідовно, я використовую Список, інакше я використовую Set.
ISet
замість нихIesi
?