2010-12-14 11 views
7

Secondo la documentazione NHibernate, istruzioni SQL vengono emesse nell'ordine seguente quando una sessione viene lavata:NHibernate ordine delle istruzioni SQL per lavare sessione

  • tutti gli inserimenti di entità, nello stesso ordine gli oggetti corrispondenti erano stati salvati usando ISession.Save()
  • tutte entità aggiorna
  • tutte le cancellazioni di raccolta
  • tutti elementi collezione cancellazioni, aggiornamenti e inserimenti
  • tutta la linea insertio ns
  • tutte le cancellazioni di entità, nello stesso ordine gli oggetti corrispondenti erano stati cancellati usando ISession.Delete()

Perché è forzato in questo ordine e c'è un modo per cambiare in modo che le istruzioni vengono eseguite nello stesso ordine in cui li do?

+0

Sono incuriosito da questo. Perché vuoi un ordine diverso, cosa stai cercando di ottenere? – Rippo

+0

Ok senza entrare troppo nei dettagli, ho una tabella molti a molti (con un pk composito) che sto cercando di cancellare prima e poi reinserire quando salvo il genitore; Ho impostato inverse = true sulla raccolta genitore, quindi devo gestire il salvataggio da solo, ma poiché gli inserimenti avvengono prima delle eliminazioni ottengo una violazione del vincolo se ho bisogno di salvare nuovamente una vecchia parte da molti a molti. Ho giocato solo con NH per un giorno o giù di lì, cercando ancora di elaborare i dettagli. – LMC

risposta

3

È in questo ordine perché è il più sicuro.

E no, non è possibile modificare l'ordine. Ma inoltre, non hai mai dato a NHibernate alcun ordine: contrassegni solo le entità per la persistenza; NHibernate determina cosa fare automaticamente.

Se si ritiene che sia necessario un maggiore controllo sulle singole operazioni SQL, è possibile utilizzare IStatelessSession anziché un normale ISession. Perdi tutte le cose che NH fa automaticamente (caricamento lento, memorizzazione nella cache, tracciamento sporco), ma puoi (devi) dire esplicitamente quando a Insert, Delete o Update un record.

+0

Ok grazie Diego, ha senso allora. – LMC

+0

Probabilmente è il più sicuro, ma è necessario ricordarlo a ogni fase del procedimento e persino un, solitamente semplice, delete-> insert diventa complicato. (Per i record con una proprietà/colonna unica s.Delete; s.Save non funzionerà). – mayu

0

Non è possibile modificare l'ordine NHibernate genera SQL in base a quanto sopra, ma è possibile ridurre le unità di lavoro.

esempio:

using(var transaction = Session.BeginTransaction()) 
{ 
    var company = Session.QueryOver<Company>().First(); 
    var employee = new Employee{ ID = Guid.NewID() }; 
    company.Employees.Add(employee); 
    Session.Flush();  

    var carSpace = new CarParkingSpace { EmployeeID = employee.ID }; 
    Session.Save(carSpace); 

    transaction.Commit(); 
} 

Aggiungendo il Session.flush() - tutto a quel punto sarà spinto alla transazione. Senza di esso, NHibernate cercherebbe di creare un parcheggio assegnato a un dipendente non ancora esistente.