实体框架:控制数据库连接并指定自己的事务
本文关键字:自己的 事务 数据库连接 框架 控制 实体 | 更新日期: 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实现。