2012-05-03 2 views
0

Я использую NHibernate для доступа к базе данных в своем приложении. У моего ISession s нет настойчивости, и я доволен этим, так как мне легче отделить мое приложение от разных слоев. Единственная трудность связана с ленивой загрузкой.Работа с ленивой загрузкой за пределами ISession?

У меня есть класс модели, которая выглядит следующим образом:

public class User { 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Country CountryOfBirth { get; set } 
    public virtual Country CountryOfResidence {get; set; } 
} 

На данный момент у меня есть CountryOfBirth и CountryOfResidence набор для fetch="join". Однако, поскольку список стран в моей базе данных в основном статичен, я хочу кэшировать эти значения. Я изменил CountryOfBirth свойство выглядеть следующим образом:

Country countryOfBirth; 
    public virtual Country CountryOfBirth{ 
     get 
     { 
      if (country is INHibernateProxy) 
       countryOfBirth = CountryRepository.GetById(countryOfBirth.Id); 
      return countryOfBirth; 
     } 
     set { countryOfBirth = value; } 
    } 

Однако, это требует мой класс модели, чтобы знать, что она используется NHibernate, который нарушает инкапсуляцию.

Есть ли лучший способ достичь этого? Например, есть ли способ заставить NHibernate автоматически проходить через мои классы репозитория, если он пытается загрузить прокси-сервер и срок его действия истек?

Или использовать другой метод?

ответ

2

Если вы хотите добавить возможности кеша, посмотрите на NHibernate L2 Cache. Проверьте этот учебник http://nhforge.org/blogs/nhibernate/archive/2009/02/09/quickly-setting-up-and-using-nhibernate-s-second-level-cache.aspx и найдите эту тему. Используя кеш, вы не публикуете свою модель с любыми прокси-серверами NH, репозиториями и т. Д.

+0

Уход, спасибо. Я думаю, что кеш второго уровня - это то, что мне нужно. – Oliver

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