Мої особисті "часто пояснювані" проблеми:
Анти-візерунки
Возитися з відірваними об’єктами (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; }
}
Можливо, більше.