C# EntityFramework ChangeTracker与MySql事务

C# EntityFramework ChangeTracker与MySql事务,c#,mysql,entity-framework,transactions,C#,Mysql,Entity Framework,Transactions,我刚刚进入实体框架,我一直在浏览文档,以便获得基本的理解 MS将数据保存到数据库的所有示例都使用了上下文的ChangeTracker,其方式与常规SQL中使用事务的方式类似(执行所有需要的查询,然后通过调用context.SaveChanges())一次应用所有查询) 示例来自: 这一切都很好。但是,在EF6支持的示例中,查看的文档中,他们同时使用ChangeTracker和常规事务 示例来自: MySqlTransaction=connection.BeginTransaction(); 尝试

我刚刚进入实体框架,我一直在浏览文档,以便获得基本的理解

MS将数据保存到数据库的所有示例都使用了上下文的ChangeTracker,其方式与常规SQL中使用事务的方式类似(执行所有需要的查询,然后通过调用
context.SaveChanges()
)一次应用所有查询)

示例来自:

这一切都很好。但是,在EF6支持的示例中,查看的文档中,他们同时使用ChangeTracker和常规事务

示例来自:

MySqlTransaction=connection.BeginTransaction();
尝试
{
使用(停车上下文=新停车(连接,错误))
{
context.Database.UseTransaction(事务);
列出车辆=新列表();
添加(新车{Manufacturer=“Nissan”,Model=“370Z”,年份=2012});
添加(新车{Manufacturer=“Ford”,Model=“Mustang”,年份=2013});
添加(新车{Manufacturer=“Chevrolet”,Model=“Camaro”,年份=2012});
添加(新车{Manufacturer=“Dodge”,Model=“Charger”,年份=2013});
context.Cars.AddRange(Cars);
SaveChanges();
}
Commit();
}
抓住
{
transaction.Rollback();
投掷;
}
我的问题是,为什么两者都用?在这种情况下使用事务有什么好处吗?如果是这样,它们是特定于MySql的,还是对所有提供者都是这样


需要明确的是,我意识到使用事务可以回滚在异常情况下所做的所有更改,但在不提交的情况下处理上下文并不能完成相同的操作?

也许它们只是向您展示了如何将现有事务传递给EF上下文,谁知道呢。无论如何,这在常规使用中确实是不必要的。不确定MySQL,但可能它没有使用隐式事务。因此,如果插入前两个car实体,但第三个失败,您希望数据库状态如何?@DavidG我认为
SaveChanges
是EF本身的一部分,而不是特定的提供者。并且它总是在应用更改之前启动新事务。@Evk是的,是的。@DavidG我希望它处于前两个之前的状态,因为异常会停止执行,所以永远不会到达提交,并且上下文也会被释放。
using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Add(blog);
    db.SaveChanges();
}
MySqlTransaction transaction = connection.BeginTransaction();
try
{
    using (Parking context = new Parking(connection, false))
    {
        context.Database.UseTransaction(transaction);

        List<Car> cars = new List<Car>();
        cars.Add(new Car { Manufacturer = "Nissan", Model = "370Z", Year = 2012 });    
        cars.Add(new Car { Manufacturer = "Ford", Model = "Mustang", Year = 2013 });
        cars.Add(new Car { Manufacturer = "Chevrolet", Model = "Camaro", Year = 2012 });
        cars.Add(new Car { Manufacturer = "Dodge", Model = "Charger", Year = 2013 });

        context.Cars.AddRange(cars);
        context.SaveChanges();
    }

    transaction.Commit();
}
catch
{
    transaction.Rollback();
    throw;
}