Domanda

Ho iniziato a passare un po 'di codice preesistente NHibernate in un progetto ASP.NET basate su SharePoint da eager loading e una nuova sessione ogni colpo di database, per pigri carico e una sessione per la durata della richiesta HTTP, e cominciò a correre in un problema.

Quando creiamo un elemento in questo sistema, ci sono alcune relazioni molti-a-uno che sono popolate dai menù a discesa. Questo ci ha l'ID, che è sufficiente per salvare nel database.

Al fine di effettuare alcuni post-Save compiti come la notifica e-mail, abbiamo quindi caricare lo stesso articolo indietro, che in precedenza ci ha otterrebbe l'intero albero oggetto popolato.

Tuttavia, poiché il cambiamento di caricamento pigro e una sessione con la durata di tutta la richiesta, siamo stati sempre NullReferenceExceptions da appartamenti qui sotto dell'oggetto che sono misteriosamente null.

Carichiamo la voce tramite NHibernate in changedItem. La chiamata che è mancato è il seguente:

changedItem.PaperMedia.FormsAnalyst.User.Contact.Name

PaperMedia è completamente popolato, ma tutto il FormsAnalyst è nullo, tranne l'ID.

Questo è lo stesso stato in cui abbiamo salvato, quindi una possibile causa di questo problema è l'oggetto della cache e semplicemente recuperate, NHibernate essendo così ignorante dei valori effettivi dal database. Comunque, sto commettendo l'acquisto, aumentata in modo esplicito chiamando Flush () sulla sessione, tra il salvataggio e il successivo carico, quindi se questo è il caso, né commit (), né Flush () non sta avendo alcun effetto sulla cache.

Ho cambiato queste proprietà nei file hbm.xml rilevanti per essere pigro = "false", e hanno setFetchMode FetchMode.Eager per tutti loro, così, a nessun effetto.

Sono stato anche considerando max_fetch_depth come la questione. Se chiamo Refresh (changedItem) sulla sessione, non ha alcun effetto. Tuttavia, se chiamo Refresh (changedItem.PaperMedia), si popolerà tutta la strada fino a Nome. Ciò sembrerebbe sconto max_fetch_depth come il problema, ma ho comunque fatto un tentativo di aumentarla, impostandolo a 6 nel hibernate.cfg.xml così come SetProperty ( "max_fetch_depth", "6") nell'istanza di configurazione durante la creazione della fabbrica di sessione, e queste hanno avuto alcun effetto sia.

Non so che altro per provare.

Qualcuno ha visto qualcosa di simile prima d'ora? Sono nuovo di NHibernate quindi potrebbe essere qualcosa di semplice ...

Modifica

Sembrerebbe che la cache è davvero il problema. Vocazione () nell'istanza sessione risolve questo comportamento.

Quindi, la questione diventa ora, perché scaricava () non aggiornare gli elementi memorizzati nella cache? Questo è esattamente quello che ho pensato è stato costruito per fare.

È stato utile?

Soluzione

Credo che Flush () è solo per l'invio modifiche al database ... sarebbe aggiornare la cache con gli oggetti di riferimento se fossero nella memoria in questo momento. Quindi, si potrebbe o utilizzare un'altra sessione o Clear () ... o popolano FormsAnalyst in primo luogo.

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