Entity Framework - Transazione
In tutte le versioni di Entity Framework, ogni volta che esegui SaveChanges()per inserire, aggiornare o eliminare il database, il framework avvolgerà tale operazione in una transazione. Quando si richiama SaveChanges, il contesto avvia automaticamente una transazione e la esegue il commit o il rollback a seconda che la persistenza sia riuscita.
Tutto questo è trasparente per te e non avrai mai bisogno di affrontarlo.
Questa transazione dura solo il tempo necessario per eseguire l'operazione e quindi viene completata.
Quando si esegue un'altra operazione simile, inizia una nuova transazione.
Entity Framework 6 fornisce quanto segue:
Database.BeginTransaction ()
È un metodo semplice e più semplice all'interno di un DbContext esistente per avviare e completare le transazioni per gli utenti.
Consente di combinare più operazioni all'interno della stessa transazione e quindi viene eseguito il commit o il rollback di tutte.
Consente inoltre all'utente di specificare più facilmente il livello di isolamento per la transazione.
Database.UseTransaction ()
Consente a DbContext di utilizzare una transazione avviata all'esterno di Entity Framework.
Diamo uno sguardo al seguente esempio in cui più operazioni vengono eseguite in una singola transazione. Il codice è come -
class Program {
static void Main(string[] args) {
using (var context = new UniContextEntities()) {
using (var dbContextTransaction = context.Database.BeginTransaction()) {
try {
Student student = new Student() {
ID = 200,
FirstMidName = "Ali",
LastName = "Khan",
EnrollmentDate = DateTime.Parse("2015-12-1")
};
context.Students.Add(student);
context.Database.ExecuteSqlCommand(@"UPDATE Course SET Title =
'Calculus'" + "WHERE CourseID = 1045");
var query = context.Courses.Where(c ⇒ c.CourseID == 1045);
foreach (var item in query) {
Console.WriteLine(item.CourseID.ToString()
+ " " + item.Title + " " + item.Credits);
}
context.SaveChanges();
var query1 = context.Students.Where(s ⇒ s.ID == 200);
foreach (var item in query1) {
Console.WriteLine(item.ID.ToString()
+ " " + item.FirstMidName + " " + item.LastName);
}
dbContextTransaction.Commit();
} catch (Exception) {
dbContextTransaction.Rollback();
}
}
}
}
}
L'inizio di una transazione richiede che la connessione del negozio sottostante sia aperta.
Quindi chiamare Database.BeginTransaction () aprirà la connessione, se non è già aperta.
Se DbContextTransaction ha aperto la connessione, la chiuderà quando viene chiamato Dispose ().