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

2019-10-18 13:42发布

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

我发现这个好文章附带了不少建议,但带来了(像我看过的所有其他条款)的TransactionScope 。 嗯,我想走就走的TransactionScope ,如果可能的话...

我能有这个游戏的解决方案,只有单纯DbConnectionDbTransaction或者这是根本不可能的还是错?

更有甚者,我发现这篇文章在这里 ,在部分指出:

指定自己的交易

正如你可以重写与连接的默认行为,你还可以控制交易功能。 如果你明确地创建自己的事务,调用SaveChanges不会创建一个DbTransaction。 您将不能创建一个System.Common.DbTransaction,虽然。 相反,创建自己的事务时,您需要使用System.Transaction.TransactionScope对象。

但没有交代...

我使用实体框架5.0。 能否请你帮我,以便选择正确的适合我的应用明白了吗? 这将是理想的给我看使用的一些好的模式。

提前致谢!

注:我打算,因为升级到DTC的Oracle数据提供交易的这一点。

Answer 1:

实体框架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



Answer 2:

实体框架维护其自己的交易是足够的。 但是它给你承诺或丢弃在交易中的变化的灵活性。 如果你不调用的SaveChanges()方法,那么它就会丢弃该交易。 此外,如果你使用的是相同的DbContext许多交易,那么这将是使用相同的连接。 如果你同时使用两个或更多的DbContext,那么将使用单独的连接,这是理想的情况。 这是我想提出一个很重要的一点是,这将是实体框架技术的浪费来实现自己的事务。 如果你想这样做的话,我会建议使用传统的方式自己实现DB。



文章来源: Entity Framework: Controlling db connection and specifying own transaction