NHibernate возвращает идентификатор вне сеанса, но не через свойство - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть такой интерфейс:

public interface ICoreType {
    int TypeID {get;}
}

И класс NHibernate, который реализует это следующим образом:

public class DueDateType : ICoreType {
    public virtual int DueDateTypeID {get;set;}
    ...
    public virtual int TypeID { get{ return this.DueDateTypeID; } }
}

Вот мое отображение:

 <class name="DueDateType" table="tdfDueDateType" lazy="true" >
    <cache usage="read-write" include="all"/>
    <id name="DueDateTypeID" column="DueDateTypeID" >
      <generator class="identity"/>
    </id>
    ...
  </class>

Когда я получаю экземпляр объекта из NHibernate, а затем возвращаю его вне области активного сеанса, в котором он был создан, я могу получить значение DueDateTypeID просто отлично, но при доступе к TypeID возникает LazyInitializationException. Для TypeID нет сопоставления, так как я просто хочу, чтобы оно возвращало любое значение DueDateTypeID.

Маркировка класса lazy = "false" в моем отображении стирает проблему. Из того, что я читал, это потому, что нет прокси-сервера, сгенерированного для ленивого сопоставленного класса.

В этом случае я хотел бы использовать функции отложенной загрузки NHibernate; мне нужно реализовать IInterceptor или что-то подобное, чтобы заставить NHibernate по-другому трактовать это свойство?

1 Ответ

3 голосов
/ 15 сентября 2011

Проблема в том, что при доступе все члены сущности запускают отложенную инициализацию (кроме идентификатора). NH не может знать, что вы на самом деле делаете внутри члена. При запуске отложенной инициализации вне сеанса вы получаете ошибку.

Предложения:

  • Старайтесь избегать любого доступа к объектам за пределами сеанса. Это безопасно только при отключении отложенной загрузки, что обычно не подходит.
  • Не заворачивайте удостоверение личности. Если вы обращаетесь к TypeID, объект инициализируется, хотя в этом нет необходимости, что отрицательно сказывается на производительности.
...