Question

J'ai mal compris le manuel NHibernate ou j'ai fait quelque chose de mal. Quelqu'un peut-il aider?

J'essaie de récupérer un utilisateur sans AuditLogEntrys. Mais NHibernate charge toujours AuditLogEntrys. Je souhaite uniquement que AuditLogEntrys soit chargé lorsque j'accède à la propriété.

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; }
}

Mappages:

  <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>

Code pour obtenir l'utilisateur:

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

      return GetByCriteria(criteria);
  }

À présent, je m'attendais à un objet Utilisateur avec une collection vide de AuditLogEntry, mais ce n'est pas ce qui se passe.

Des idées? Merci.

Était-ce utile?

La solution

Avec un chargement paresseux, vous obtiendrez une liste d’objets remplis, mais ils ne sont pas encore "hydratés". de la base de données. Les objets chargés paresseux ne sont pas vos types d'entité, mais sont des "objets proxy". qui seront remplies / hydratées avec des données réelles lorsque vous accédez aux éléments de la collection.

L’utilisation d’objets proxy est la raison pour laquelle vous devez rendre toutes vos propriétés virtuelles dans vos types d’entités. Les types de proxy sont des sous-classes de votre type d'entité générées dynamiquement, qui effectuent les appels réels à la base de données lorsque vous accédez aux propriétés.

J'espère que j'ai compris votre question, mais la différence est que vous récupérez les objets réels, pas une liste vide. Si vous obtenez une liste vide, cela signifie qu’il n’y avait aucun élément AuditLogEntry référençant votre utilisateur dans la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top