Статические поиски в NHibernate - PullRequest
1 голос
/ 31 июля 2009

Я хочу использовать некоторые из предопределенных поисков без обходов в базу данных в NHibernate.

В основном я хотел бы иметь такой код:

public class Countries
{
  static Countries() {
    Australia = new Country
      {
          Id = 14,
          Description = "Australia"
      }
  }
  public static Country Austrlia { get; protected set }
}

Затем напишите этот фрагмент кода:

address.Country = Countries.Australia;// Snippet1
if (address.Country == Countries.Australia) { // Snippet2
  // Do something
}

Поэтому я переопределяю Equals, GetHashCode и даже операторы перегрузки == и! = Для поиска в классе страны.

Snippet1 работает ТОЛЬКО, если Страна с данным Id не была загружена в память. В противном случае он генерирует исключение NonUniqueObjectException, сообщая, что объект с данным Id уже находится в памяти.

Чтобы обойти это, я должен выселить загруженную страну и затем присвоить значение поиска. Это неправильно, и я не уверен, что произойдет, когда запрос на поиск по стране будет выполнен снова.

Итак, вопрос: как поддерживать статические классы поиска в NHibernate?

Спасибо, Дмитрий.

Ответы [ 2 ]

2 голосов
/ 01 августа 2009

Проверьте, что мы называем Перечисление классов ..

Это в основном шаблон flyweight .

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

Мы делаем с ними сумасшедшие вещи. Например, предоставляет автоматически сгенерированные таблицы поиска с внешними ключами для сотрудников DBA, сохраняя все значения в коде.

1 голос
/ 07 августа 2009

Кажется, что NHibernate не может обрабатывать 2 объекта логически одинаково (но разные экземпляры).
Поэтому вместо того, чтобы смешивать «статический поиск» с поиском в базе данных, лучше использовать только один из них.

В моем случае - поиски, хранящиеся в базе данных. НО, чтобы избежать обхода базы данных только ради получения объекта, нужно только использовать Load вместо Get:

address.Country = Session.Load<Country>(CountryIds.Australia); // This does not hit DB
address.Country = Session.Get<Country>(CountryIds.Australia); // This DOES hit DB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...