NHibernate - Ленивая загрузка коллекций - не работает - PullRequest
0 голосов
/ 09 сентября 2009

Я либо неправильно понял руководство NHibernate, либо сделал что-то не так. Кто-нибудь может помочь?

Я пытаюсь получить пользователя без AuditLogEntrys. Но NHibernate все еще загружает AuditLogEntrys. Я хочу, чтобы AuditLogEntrys загружался только при доступе к свойству.

public class User
{
    public virtual int UserId { get; set; }
    public virtual string UserName { get; set; }
    public virtual IList<AuditLogEntry> AuditLogEntrys { get; set; }
}

public class AuditLogEntry
{
    public virtual int Id { get; set; }
    public virtual DateTime DateRead { get; set; }
    public virtual string MachineName { get; set; }
}

Отображения:

  <class name="Model.User, Model" 
     table="User" 
     lazy="true">
  <id name="UserId" access="property" column="UserID">
    <generator class="native"></generator>
  </id>
  <property name="UserName" access="property" />
  <bag name="AuditLogEntrys" lazy="true" access="property">      
    <key column="UserID" />      
    <one-to-many class="Model.AuditLogEntry, Model"></one-to-many>
  </bag>

  <class name="Model.AuditLogEntry, Model"
     table="AuditLog"
     lazy="true">
    <id name="Id" access="property" column="ID">
      <generator class="native"></generator>
    </id>        
    <property name="DateRead" access="property" column="DateRead"></property>
    <property name="MachineName" access="property" column="MachineName"></property>    
  </class>

Код для получения пользователя:

  public IList<User> GetUserByUserName(string userName)
  {
      ICriteria criteria = NHibernateSession.CreateCriteria(typeof(User))
          .Add(Expression.Eq("UserName", userName));

      return GetByCriteria(criteria);
  }

Теперь я ожидал, что объект User с пустой коллекцией AuditLogEntry, но это не то, что происходит.

Есть идеи? Спасибо.

1 Ответ

3 голосов
/ 09 сентября 2009

При отложенной загрузке вы получите заполненный список объектов, но они еще не «увлажнены» из базы данных. Лениво загруженные объекты не являются типами ваших сущностей, а являются «прокси-объектами», которые будут заполнены / заполнены реальными данными при доступе к элементам в коллекции.

Использование прокси-объектов является причиной, по которой вам нужно сделать все ваши свойства виртуальными в ваших типах сущностей. Типы Proxy - это динамически генерируемые подклассы вашего типа сущности, которые выполняют реальные вызовы базы данных при доступе к свойствам.

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

...