Se non è pesante, la soluzione 1 è sicuramente quella che ti da meno problemi, io adotterei quella principalmente. Comunque in ogni caso io attiverei la concorrenza ottimistica, in questo modo nhibernate o EF ti tira un eccezione quando fai update su un oggetto che è stato modificato da qualcuno tra il momento in cui è stato letto ed il momento in cui lo salvi :)
Questo è indipendente dal db utilizzato, e supportato sia da EF sia da NHibernate.
Se non puoi ammettere questa situazione, un lock può essere la soluzione giusta, in alcuni casi un processo prende un oggetto, lo locka, lo lavora (per un tempo breve) per cui se qualcun altro ci accede rimane con il lock bloccato fino a che il primo non rilascia il lock. In questo caso le prestazioni si abbassano, ma puoi serializzare le operazioni ed evitare conflitti a priori.
alk.
--Blog Eng: http://www.codewrecks.com/blogBlog Ita: http://blogs.ugidotnet.org/rgmTwitter: http://twitter.com/alkampfer
quoto Alk: "scenario 1 tutta la vita" :-)
Ho dato una sguardata veloce al codice, allora, solitamente la sessione viene gestita da "qualcuno". Il repository che ha i metodi add, remove, delete, query etc, quando deve fare un operazione chiede ad un SessionManager
GetSession
E stop. Nel web ci sarà un sessionmanager che gestisce una sessione per ogni richiesta, per un servizio ho intercettori che fanno una session per ogni chiamata al wcf, per mvvm hai un gestore che tiene la sessione con il view model etc etc.
Il bello di un ORM è questo, quando la sessione viene distrutta l'oggetto è automaticamente "Detatched", quando fai session.saveorUpdate(oggetto) lui automaticamente riattacca l'oggetto, controlla se è cambiato (se hai concorrenza ottimistica) etc etc etc. per cui diciamo che fai molta meno fatica del solito.
Il gestore di sessione è solitamente un robo che fa questo, quando gli vieen chiesta la sessione vede se ne è presente una nel suo contesto (e da Ioc come contesto puoi mettere httpcontext.current se sei nel web, remoting.callcontext, threadcontext, etc etc). Se no è presente ne crea una e la mette nel contesto, se è presente controlla se è chiusa, se è chiusa ne crea un altra come se non ci fosse, etc etc.
Questo perchè se fai un flush, e nh ti genera una eccezione, la sessione la devi scartare comunque, indpendntemetne dal suo ciclo di vita, non è più valida, non la puoi più usare, etc etc etc :)
Ciao Andrea,
Andrea Saltarello: quoto Alk: "scenario 1 tutta la vita" :-)
Ho implementato lo scenario 1 e mi sono ritrovato con una bella "Illegal attempt to associate a collection with two open sessions".
Ok, ho sbagliato qualcosa ma... cosa?
;-)
Ciao e grazie,
Giulio
--
Hai un problema di gestione di sessione, questo errore significa che tu hai due sessioni vive e stai cercando di associare una collection con due sessioni conteporaneamente.
Questo tipo di errori dipende solitamente da una mancata chiusura delle sessioni e da un errato gestione del ciclo di vita della sessione stessa :)
Nhibernate profiler ti aiuta molto in questo caso. Verifica di non avere più sessioni aperte contemporanetamente per lo stesso flusso logico e che vengano sempre chiuse.