ciao,
cleaner ha scritto:
Sul click "Salva" dovrò ciclare la mia gridview e passare il tutto a UpdateStatisticsPlayers concordi?
sì, indubbiamente puoi risolvere anche in questo modo. Cicli le righe della gridview, raccogli dal suo interno i valori dei campi, istanzi un nuovo Player per ogni riga, ne valorizzi le proprietà con i valori che hai estratto, aggiungi il Player così formato ad una lista, passi la lista all'UpdateStatisticsPlayers. Così tutti i Player verranno aggiornati nella stessa transazione.
= oppure =
Lasci che siano la GridView e l'ObjectDataSource a fare tutto questo lavoro per te. Alla pressione del bottone di salvataggio, invoca l'.UpdateRow per ogni riga. Fine.
for (int i = 0; i < tuaGridView.Rows.Count; i++) {
tuaGridView.UpdateRow(i, true);
}
Invocare l'UpdateRow farà in modo che la GridView passi i valori della riga all'ObjectDataSource che si preoccuperà di istanziare un Player e inserirci dentro tutti i valori che ha ricevuto. Contestualmente, invocherà un metodo UpdateStatisticsPlayer sul tuo manager.
[DataObjectMethod(DataObjectMethodType.Update)]
public void UpdateStatisticsPlayer(Player player){
//qui il codice per l'update del singolo player
session.Save(player);
}
Se scegli questo secondo sistema bisogna tener conto di due cose:
- Il primo è facile: bisogna che sull'ObjectDataSource tu metta l'attributo DataObjectTypeName per indicare il tipo di oggetto (Player) con cui ha a che fare. Quindi per esempio lo valorizzerai così... DataObjectTypeName="NomeNamespace.Player". Ah, ovviamente tutto questo è valido se Player ha un costruttore pubblico, cioè se puoi crearne liberamente delle istanze anche essendo al di fuori dello strato di business logic. Altrimenti puoi creare un metodo UpdateStatisticsPlayer che accetti tanti parametri, uno per ogni proprietà.
- Il secondo è che, aggiornando i Player singolarmente, ottieni ogni volta una sessione diversa e quindi non verranno persistiti transazionalmente nel database. Per evitare questo problema, segui l'articolo che ti avevo postato l'altra volta. Eccolo qui:
http://nhibernate.hibernatingrhinos.com/27/the-repository-pattern
Leggi il paragrafo "The Unity of work to the rescue" e anche il capoverso precedente. Così facendo otterrai sempre la stessa sessione ad ogni esecuzione di UpdateStatisticsPlayer.
Deciti tu se impiegare la prima o la seconda soluzione.
La seconda mi sembra più elegante e ti rende più libero. Allo strato di presentazione non deve importare nulla di transazioni e ORM, né deve preoccuparsene, ma deve poter aggiungere oggetti quando e come vuole, secondo me.
ciao,
Modificato da BrightSoul il 19 novembre 2011 15.50 -