2009-05-01 1 views
13

Sto eseguendo un aggiornamento standard in NHibernate su una singola proprietà. Tuttavia sul commit della transazione l'aggiornamento sql sembra impostare tutti i campi che ho mappato sulla tabella anche se non sono stati modificati. Sicuramente questo non può essere un comportamento normale in Nhibernate? Sto facendo qualcosa di sbagliato? GrazieL'aggiornamento di NHibernate su singole proprietà aggiorna tutte le proprietà in sql

using (var session = sessionFactory.OpenSession()) 
      { 
       using (var transaction = session.BeginTransaction()) 
       { 
        var singleMeeting = session.Load<Meeting>(10193); 
        singleMeeting.Subject = "This is a test 2"; 

        transaction.Commit(); 
       } 
      } 
+0

appena incontrato la stessa situazione. Penso che questo sia un difetto di default e cercherò discussioni online nei forum appropriati. questo ha causato bug in un'applicazione server su cui sto lavorando - poiché modifica la logica dell'applicazione, in genere nei casi di azioni simultanee in cui viene creato un oggetto, quindi recuperato, recuperato da un altro thread/processo (sessione diversa), modificato e aggiornato (aggiornamento di campi separati non correlati). l'ultimo aggiornamento verrà eseguito sulle modifiche della transazione precedente ... Ho consultato questo con i miei colleghi e riteniamo che il guadagno in termini di prestazioni non sia drastico. –

+0

@ YonatanKarni, questo non riguarda solo le prestazioni, ma anche la coerenza. Vedere questa [domanda] (/ q/13954882/1178314) e la sua [risposta attualmente accettata] (/ a/13955305/1178314). –

risposta

16

Questo è il comportamento normale. È possibile provare ad aggiungere dynamic-update="true" alla definizione della classe per sovrascrivere questo comportamento.

3

Bene. sì, questo è un comportamento normale per NHibernate. È possibile utilizzare l'attributo generato per le proprietà per modificare il comportamento. Dettagli su Ayende's blog.

Perché questa impostazione predefinita è perché con la dinamica non si ottiene il piano di query memorizzato nella cache. E di solito non ti dispiace che tu invii pochi byte in più sulla connessione di rete ad alta velocità tra il server delle applicazioni e il database. A meno che non si stiano salvando stringhe lunghe in cui questa impostazione è perfettamente appropriata.

+0

While Generated significa che il campo non verrà inviato attraverso un aggiornamento, significa anche che il campo è gestito lato server. Invece NabilS sta cercando quei campi da inviare che sono cambiati. –

+0

In realtà quel post sul blog non fornisce i dettagli richiesti, in quanto si riferisce al livello di proprietà. @ La risposta di Darin è a livello di classe, che è dove vuoi modificare questo comportamento. – Jonno