37 messaggi dal 19 settembre 2010
Buongiorno a tutti , vi sottopongo il seguente quesito: si possono aggiungere piu' record su tabelle diverse usando la TransactionScope oppure funziona solo su una tabella? Mi spiego meglio se ho una tabella con la testata della fattura ed una altra con le righe della fatture e' possibile inserire l'insermento nel db in una transazione unica? Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

pistelli2001 ha scritto:

si possono aggiungere piu' record su tabelle diverse

Certamente, puoi eseguire comandi su più tabelle.

Anzi, i comandi che esegui nell'ambito di un TransactionScope possono addirittura coinvolgere database servers diversi, purché supportino tutti le transazioni distribuite.

ciao,
Moreno.

Enjoy learning and just keep making
37 messaggi dal 19 settembre 2010
Grazie Moreno..... Ci provo
37 messaggi dal 19 settembre 2010
Provato ma....... Ho usato una for next con la quale inserisco dei record in una tabella ma al secondo inserimento mi da errore . Se invece il record e' unico gira il tutto ma non registra il record

System.Data.EntityException è stata individuata
HResult=-2146233087
Message=Errore del provider sottostante in Open.
Source=System.Data.Entity
StackTrace:
in System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
in System.Data.EntityClient.EntityConnection.Open()
in System.Data.Objects.ObjectContext.EnsureConnection()
in System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
in System.Data.Objects.ObjectContext.SaveChanges()
in HotelPlus.Modulecontnew.registramov1(Int32 n) in C:\HotelPlus\Modulecontnew.vb:riga 62
InnerException: System.InvalidOperationException
HResult=-2146233079
Message=Impossibile inserire l'oggetto connessione nell'ambito di una transazione.
Source=System.Data.SqlServerCe
StackTrace:
in System.Data.SqlServerCe.SqlCeConnection.Open()
in System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
InnerException:


IL CODICE E' QUESTO:
Using Context As New DbHotelPlusEntities
Using Transaction As New TransactionScope()
Try
For ind = 1 To 8
Dim rec1 As New Pririghe
With rec1
.Pri_Numreg = Val(PN_Testata(1))
.Key_Stru = idstruttura
.Pri_Anno = Val(PN_Testata(2))
.
.
.
.
.

End With
Context.Pririghe.AddObject(rec1)
Next
Context.SaveChanges()
Transaction.Complete()
success = True
Catch ex As Exception
End Try
End Using
Context.AcceptAllChanges()
Context.Dispose()
End Using



Grazie!!!!
Modificato da pistelli2001 il 30 dicembre 2013 22.52 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
dato che stai usando Entity Framework, in questo caso puoi fare a meno del TransactionScope. Puoi semplicemente scrivere così:

Using Context As New DbHotelPlusEntities
For ind = 1 To 8
Dim rec1 As New Pririghe 
With rec1
.Pri_Numreg = Val(PN_Testata(1))
.Key_Stru = idstruttura
.Pri_Anno = Val(PN_Testata(2))
.
.
.
.
.

End With
Context.Pririghe.AddObject(rec1)
Next
Try
Context.SaveChanges()
success = True
Catch ex As Exception
'Qui devi decidere cosa fare in caso di errore. Magari fai un ulteriore tentativo e in ogni caso avvisa l'utente
End Try
End Using
End Using

...perché come indicato nella documentazione:

Entity Framework supporta l'inserimento automatico delle transazioni. [...] Quando si chiama SaveChanges, se è presente una transazione corrente, questa viene utilizzata da Entity Framework per le operazioni nell'origine dati. In caso contrario, viene creata una nuova transazione per l'operazione.


Il TransactionScope potresti usarlo, ad esempio, per personalizzare esplicitamente la tua transazione o per coordinare gli aggiornamenti da due contesti diversi. In questo caso Sql Server CE ha qualche problema, non sono sicuro del motivo... forse è legato al fatto che non supporta le nested transactions.

Comunque non ha importanza, perché le transazioni "normali" (definite lightweight transactions) invece le supporta, ed è per questo che ti basta invocare il SaveChanges per avere tutti i comandi eseguiti in maniera atomica (cioè o tutti hanno successo o nessuno).

ciao,
Moreno

Enjoy learning and just keep making
37 messaggi dal 19 settembre 2010
Ok allora quando uso un ciclo cioe' registro piu' record non mi da alcun errore ma non scrive sul db, mentre un record unico si.
Questo succede da quando ho cambiato la strategia del codice da nessuno a predefinito nell'entity model. Con nessuno non esisteva ad esempio il saveallchange, ho settato cosi' per avere la transaction . L'aggiunta dei record era semplicemente add ora addobject

Grazie Buon anno a tutti
37 messaggi dal 19 settembre 2010
Grazie Moreno... Leggendo su internet ho notato l'evoluzione del framework da ultimo da objectset<T> a dbset<T> quest'ultimo piu' performante e semplice .... Chiaramente per uno che inizia il tutto risulta poco chiaro. Grazie e buon anno a tutti e che sia un 2014 che vi porti salute e serenita'
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, Buon Anno anche a te!

pistelli2001 ha scritto:

quando uso un ciclo cioe' registro piu' record non mi da alcun errore ma non scrive sul db

E' normale che sia così perché l'invocazione di AddObject non ha lo scopo di scrivere nel db ma quello di aggiungere il tuo oggetto al contesto.

Internamente, il contesto tiene un registro di tutto ciò che è stato aggiunto, modificato o eliminato. Questo significa che l'accesso al db è ottimizzato, perché puoi chiamare AddObject molteplici volte, per poi inviare le modifiche al database tutte insieme, nell'ambito di un'unica transazione, quando finalmente invochi SaveChanges.

pistelli2001 ha scritto:

evoluzione del framework da ultimo da objectset<T> a dbset<T> quest'ultimo piu' performante e semplice .... Chiaramente per uno che inizia il tutto risulta poco chiaro

Ok, investi un'oretta di tempo per guardare questa presentazione di Stefano Mostarda. Ti introdurrà alle novità di Entity Framework 6, la nuova versione rilasciata pochi mesi fa.
http://media.aspitalia.com/events/aspilive-Entity-Framework-6.media

ciao e di nuovo auguri!

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.