1

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

我发现这篇很好的文章附带了很多建议,但是(就像我读过的所有其他文章一样)提出了TransactionScope. 好吧,如果可能的话,我想远离TransactionScope……

我可以只用纯DbConnection&来解决这个DbTransaction问题吗?或者这根本不可能或错误?

更重要的是,我在这里找到了这篇文章,在部分说明:

指定您自己的交易

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

但是没有解释...

我正在使用实体框架 5.0。您能否帮助我理解以便为我的应用程序选择正确的?最好向我展示一些好的使用模式。

提前致谢!

注意:我计划这样做是因为事务升级到 Oracle 数据提供程序的 DTC。

4

2 回答 2

2

Entity Framework 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.

于 2013-08-30T09:58:14.920 回答
0

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

于 2013-08-30T09:32:46.647 回答