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

时间:2013-08-30 09:22:17

标签: c# entity-framework transactions dbcontext transactionscope

我想找到一种方法来控制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。

2 个答案:

答案 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技术。如果你想这样做,那么我建议你以传统的方式使用你自己的数据库实现。