我想找到一种方法来控制EF的底层数据库连接&事务以确保我的应用程序在一次事务期间一次只使用一个连接(我需要同时支持Oracle和SQL Server)。
我发现这个good article附带了很多建议,但是提出了(就像我读过的所有其他文章一样)TransactionScope
。好吧,如果可能的话,我想远离TransactionScope
......
我是否可以通过纯DbConnection
& DbTransaction
或者这根本不可能或错了?
更多的是,我找到this article here,说明了部分:
“ 指定您自己的交易 ”
正如您可以使用连接覆盖默认行为一样,您 还可以控制交易功能。如果你明确创建 在您自己的事务中,SaveChanges不会创建DbTransaction。您 但是,不会创建System.Common.DbTransaction。相反,什么时候 创建自己的交易,需要使用 System.Transaction.TransactionScope对象。
但是没有解释......
我正在使用Entity Framework 5.0。你能帮我理解一下,为我的申请选择正确吗?向我展示一些良好的使用模式是理想的。
提前致谢!
注意:我正在计划这个,因为事务升级到DTC for Oracle Data Provider。
答案 0 :(得分:2)
实体框架6有两个功能可能对此有所帮助:
如果您确实想使用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
。
答案 1 :(得分:0)
实体框架维护自己的交易就足够了。但是,它使您可以灵活地提交或放弃事务中的更改。如果您不调用SaveChanges()方法,则它将丢弃该事务。此外,如果您对许多事务使用相同的DbContext,那么它将使用相同的连接。如果您同时使用两个或更多DbContext,那么它将使用单独的连接,这是理想的情况。这是一个非常重要的一点,我想要实现自己的事务是浪费Entity Framework技术。如果你想这样做,那么我建议你以传统的方式使用你自己的数据库实现。