Entity Framework - Транзакция
Во всех версиях Entity Framework всякий раз, когда вы выполняете SaveChanges()чтобы вставить, обновить или удалить базу данных, фреймворк заключит эту операцию в транзакцию. Когда вы вызываете SaveChanges, контекст автоматически запускает транзакцию и фиксирует или откатывает ее в зависимости от того, удалось ли сохранить сохранение.
Все это прозрачно для вас, и вам никогда не придется с этим сталкиваться.
Эта транзакция длится достаточно долго, чтобы выполнить операцию, а затем завершается.
Когда вы выполняете другую такую операцию, начинается новая транзакция.
Entity Framework 6 предоставляет следующее:
Database.BeginTransaction ()
Это простой и легкий метод в существующем DbContext для запуска и завершения транзакций для пользователей.
Это позволяет объединить несколько операций в одной транзакции, и, следовательно, либо все фиксируются, либо все откатываются как одна.
Это также позволяет пользователю более легко указать уровень изоляции для транзакции.
Database.UseTransaction ()
Это позволяет DbContext использовать транзакцию, которая была запущена вне Entity Framework.
Давайте посмотрим на следующий пример, в котором несколько операций выполняются в одной транзакции. Код такой -
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();
}
}
}
}
}
Для начала транзакции необходимо, чтобы соединение с базовым магазином было открыто.
Таким образом, вызов Database.BeginTransaction () откроет соединение, если оно еще не открыто.
Если DbContextTransaction открыл соединение, он закроет его при вызове Dispose ().