Які найпоширеніші помилки та анти-шаблони створюють користувальницькі програмісти NHibernate?


28

Які найпоширеніші помилки та анти-шаблони роблять користувачі програми програми NHibernate? Будь ласка, поясніть, чому це погані практики, або дайте посилання на ресурс для подальшого читання.

Наприклад:

  • Один антидіапазон, поширений для нових програмістів NHibernate, - це використовувати ідентифікацію / нативні POID, а не вбудовані стилі ORM. Детальніше тут ...

1
Ви можете знайти деякі поширені помилки тут: NHProf Alerts

1
Також тут є кілька цінних публікацій про

Відповіді:


34

Мої особисті "часто пояснювані" проблеми:

Анти-візерунки

Возитися з відірваними об’єктами (SaveOrUpdate або Merge плюс деякий безладний код) замість використання DTO. Чим складніші сутності, тим Messier являє собою код. (Це також означає, що він досить добре працює з тривіальними сутностями.) Ейенде також називає його " Стриптиз-шаблоном" і пояснює питання інкапсуляції.

Не розуміючи стійкості незнання та написання програм NH, як при використанні явного SQL. Симптом цього: викликати оновлення після зміни об'єкта, цікавитись, чому зміни зберігаються, навіть якщо оновлення не викликали, і цікавити, як уникнути змін.

Не розуміючи транзакцій та структури одиниці роботи . Часті антидіаграми: неявні транзакції, сеанс за операцією та сеанс за програмою. Ще кілька читань:

Використання подій NH для введення логіки програми (наприклад, відстеження змін у тригерах вставки та оновлення)

Створіть один клас за столом . Деякі люди не розуміють ООД, інші не розуміють реляційний дизайн.

Помилки

використання один-до-одного замість багатьох-до-одного. Я спробував це пояснити у цій відповіді .

Використання файлу приєднання в поєднанні з SetMaxResult. Мої останні відповіді на цю тему:

Написання сут, що змінюються . Якщо суб'єкт господарювання не точно повертає значення, яке було встановлено NH, воно вважається брудним і оновлюється в кожному сеансі. Наприклад: заміна постійної колекції NH у програмі налаштування властивостей.

  IList<Address> Addresses
  {
    get { return addresses; }
    // will cause the addresses collection to be built up from scratch
    // in the database in every session, even when just reading the entity.
    set { addresses = new List<Address>(value); }
  }

  int Whatever
  {
    // will make the entity dirty after reading negative values from the db.
    // this causes unexpected updates after just reading the entity.
    get { if (whatever < 0) return 0; }
    set { whatever = value; }
  }

Можливо, більше.


2
+1: Ви повинні додати у свій список "Не використовуючи шаблон одиниці роботи" та "Один сеанс на додаток".
Сокіл

@Falcon: так, мабуть. Це загальна проблема "не розуміння транзакцій". Одиниця роботи трохи охоплена наполегливим незнанням. Хоча це абсолютно різні поняття, вони призводять до однакових моделей.
Стефан Штейнеггер

5

" Виберіть проблему N + 1 ".

Тут ви закінчите виконувати вибір для кожної сутності, якою ви хочете маніпулювати (N), і вибір, щоб отримати список сутностей (+1), а не один вибір усіх об'єктів та їх атрибутів.


1
  • Занадто багато абстракцій
  • Не використовується Автозавантаження з FluentNHibernate

Перший пункт трохи розпливчастий, але у випадку, якщо ви посилаєтесь на дурні поняття, як таке приховування ISession за "сховищем" чи "DAO", я погоджуюся.
chris

1
Однак другий пункт - це нісенітниця. Є вагомі причини, чому ми часто хочемо мати тонкозернистий контроль над фізичною моделлю даних та мати змогу відокремити це від доменної моделі. Зрештою, в цьому і полягає точка "М" в "ORM". Використання автоматичних накладок (хоча корисно у простих сценаріях) перемагає це. Крім того, існує також питання інтеграції застарілих схем баз даних, для яких автоматичне використання марно.
chris

Я використовую вбудований на основі конвенції код відображення. Це справляється з великою суєтою, яку я б інакше повинен був повторити. Однак він все ще надає свободу індивідуальному налаштуванню, окрім сутності, що розшаровується на відображення, створене конвенцією. Це супер корисно.
Сем

1

Намагаючись викласти його, щоб згодом ви могли перейти на Entity Framework (або щось інше).

Це набагато, набагато важче, ніж більшість людей, які намагаються це зрозуміти. Між ними є чимало відмінностей, які можуть втягнути вас в дорогу, що часом може бути досить тонким. Це також дуже нечасто, що воно насправді знадобиться в кінцевому підсумку - настільки, що ви можете ретельно намагатися впроваджувати це роками, перш ніж виявити, що ваш підхід - це все неправильно.

Крім того, це обмежує використання цілого ряду корисних і важливих функцій NHibernate, таких як кешування другого рівня, перехоплення, управління одночасністю, відстеження змін, попередній вибір запитів тощо.

Якби дійсно існувала обґрунтована потреба перемикатися між NHibernate та Entity Framework, існував би активно розроблений проект для підтримки цього на GitHub (можливо, щось подібне до CommonServiceLocator) з численними дописувачами та запитами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.