EntityFramework⼊门教程(19)---EF中使⽤事务
EF中使⽤事务
这节介绍EF6中事务的使⽤。EF core中事务的使⽤⽅式和EF6中⼀模⼀样。
1.EF中的默认的事务
  默认情况下,当我们执⾏⼀个SaveChanges()⽅法时就会新建了⼀个事务,然后将context中的CUD操作都在这个事务中进⾏。Context 中有多个SaveChanges()时,每⼀个SaveChanges()都会执⾏⼀个单独的事务。⼀个栗⼦:
using (var context = new SchoolContext())
{
context.Database.Log = Console.Write;
var standard = context.Standards.Add(new Standard() { StandardName = "1st Grade" });
context.Students.Add(new Student()
{
FirstName = "Rama",
StandardId = standard.StandardId
});
context.SaveChanges();
context.Courses.Add(new Course() { CourseName = "Computer Science" });
context.SaveChanges();
}
上边的代码执⾏结果如下:
从上边的栗⼦我们可以清楚地看到每个SaveChanges()⽅法都开启了⼀个事务。这时有⼀个问题:有
没有什么办法让多个SaveChanges()在⼀个事务中执⾏呢?这样的话就可以减少事务创建、开启进⽽提升性能了。
2.⼀个事务执⾏多个SaveChanges()⽅法
EF6和EF core中提供了两种⽅法实现在⼀个事务中执⾏多个SaveChanges()⽅法。
① DbContext.Database.BeginTrasaction():新建⼀个事务,在新建的事务内进⾏context.SaveChanges()
②DbContext.Database.UseTransaction(trans):使⽤⼀个context作⽤域外的现有的事务,多个context都可以在通过这个事务⼀起提交。
1.DbContext.Database.BeginTrasaction()
⼀个栗⼦:
using (var context = new SchoolContext())
{
context.Database.Log = Console.Write;
using (DbContextTransaction transaction = context.Database.BeginTransaction())
{
try
{
var standard = context.Standards.Add(new Standard() { StandardName = "1st Grade" });
context.Students.Add(new Student()
{
FirstName = "Rama",
StandardId = standard.StandardId
});
context.SaveChanges();
// 第⼀个SaveChanges()⽅法后抛出异常
throw new Exception();
context.Courses.Add(new Course() { CourseName = "Computer Science" });
context.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Console.WriteLine("Error occurred.");
}
}
}
执⾏结果:
我们可以看到所有的SaveChanges()都被回滚了。如果把抛出异常的代码注释掉那么执⾏效果如下:
2.DbContext.Database.UseTransaction(trans)
使⽤DbContext.Database.UseTransaction(trans),我们通过参数传⼊的是⼀个作⽤域外的事务,注意:这⾥EF不会再新建内置的事务,⽽是使⽤通过参数传⼊的事务。
⼀个栗⼦:
private static void Main(string[] args)
{
string providerName = "System.Data.SqlClient";
string serverName = ".";
string databaseName = "SchoolDB";
// ⽬标数据库
SqlConnectionStringBuilder sqlBuilder =new SqlConnectionStringBuilder();
sqlBuilder.DataSource = serverName;
writeline教程
sqlBuilder.InitialCatalog = databaseName;
sqlBuilder.IntegratedSecurity = true;
using (SqlConnection con = new SqlConnection(sqlBuilder.ToString()))
{
con.Open();
    //在DbContext作⽤域外新建⼀个事务
using (SqlTransaction transaction = con.BeginTransaction())
{
try
{
         //使⽤上边的创建的事务
using (SchoolContext context = new SchoolContext(con, false))
{
context.Database.UseTransaction(transaction);
context.Students.Add(new Student() { Name = "Ravi" });
context.SaveChanges();
}
using (SchoolContext context = new SchoolContext(con, false))
{
context.Database.UseTransaction(transaction);
context.Grades.Add(new Standard() { GradeName = "Grade 1", Section = "A" });
context.SaveChanges();
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Console.WriteLine(ex.InnerException);
}
}
}
}
EF系列⽬录链接:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。