Domanda

Ho frainteso il manuale di NHibernate o ho fatto qualcosa di sbagliato. Qualcuno può aiutare?

Sto cercando di recuperare un utente senza AuditLogEntrys. Ma NHibernate sta ancora caricando AuditLogEntrys. Voglio caricare AuditLogEntrys solo quando accedo alla proprietà.

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

Mapping:

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

Codice per ottenere l'utente:

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

      return GetByCriteria(criteria);
  }

Ora mi aspettavo un oggetto Utente con una raccolta vuota di AuditLogEntry, ma non è questo ciò che sta accadendo.

Qualche idea ?? Grazie.

È stato utile?

Soluzione

Con il caricamento lento, otterrai un elenco popolato di oggetti, ma non sono ancora " idratati " dal database. Gli oggetti caricati pigramente non sono i tipi di entità, ma sono invece "oggetti proxy" che verrà popolato / idratato con dati reali quando accedi agli elementi nella raccolta.

L'uso di oggetti proxy è il motivo per cui è necessario rendere virtuali tutte le proprietà nei tipi di entità. I tipi proxy sono sottoclassi generate dinamicamente del tipo di entità, che effettuano le chiamate effettive al database quando si accede alle proprietà.

Spero di aver capito la tua domanda, ma la differenza è che hai recuperato oggetti reali, non un elenco vuoto. Se ritorni un elenco vuoto, significa che non c'erano elementi AuditLogEntry che fanno riferimento al tuo utente nel database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top