实体框架:控制数据库连接并指定自己的事务

本文关键字:自己的 事务 数据库连接 框架 控制 实体 | 更新日期: 2023-09-27 18:29:33

我想找到一种方法来控制EF的底层数据库连接&事务,以确保我的应用程序在一个事务中一次只使用一个连接(我需要同时支持Oracle和SQL Server)。

我发现了这篇很好的文章,其中有很多推荐,但(像我读过的所有其他文章一样)提到了TransactionScope。嗯,如果可能的话,我想远离TransactionScope。。。

我能用纯DbConnection&DbTransaction还是这根本不可能或错误?

更重要的是,我在这里找到了这篇文章,在第节中陈述:

"指定您自己的交易"

正如您可以使用连接覆盖默认行为一样还可以控制事务功能。如果显式创建您自己的事务,SaveChanges将不会创建DbTransaction。你不会创建System.Common.DbTransaction。相反,当创建自己的事务时,需要使用System.Transaction.TransactionScope对象。

但没有任何解释。。。

我使用的是实体框架5.0。你能帮我理解一下,以便为我的申请选择正确的吗?向我展示一些好的使用模式会很理想。

提前感谢!

注意:我之所以计划这样做,是因为Oracle Data Provider的事务升级为DTC。

实体框架:控制数据库连接并指定自己的事务

Entity Framework 6有两个功能可以帮助实现这一点:

  • 显式事务支持
  • 能够从DbConnection创建DbContext

如果你确实想使用EF5,你需要使用TransactionScope:

var context = new MyContext();
using (var transaction = new TransactionScope())
{
    MyItem item = new MyItem();
    context.Items.Add(item);
    context.SaveChanges();
    item.Name = "Edited name";
    context.SaveChanges();
    transaction.Complete();
}

如链接文章中所述,您需要参考System.Transactions才能获得TransactionScope

Entity Framework维护自己的事务,这就足够了。然而,它为您提供了提交或放弃事务中更改的灵活性。如果您不调用SaveChanges()方法,那么它将丢弃事务。另外,如果您对许多事务使用相同的DbContext,那么它将使用相同的连接。如果同时使用两个或多个DbContext,那么它将使用单独的连接,这是理想的情况。这里有一点非常重要,我想说的是,实现自己的事务将是对实体框架技术的浪费。如果您想这样做,那么我建议以传统的方式使用您自己的DB实现。