我想找到一种方法来控制EF的底层数据库连接和事务,以确保我的应用程序是一个事务期间使用在同一时间只有一个连接(我将需要同时支持Oracle和SQL Server)。
我发现这个好文章附带了不少建议,但带来了(像我看过的所有其他条款)的TransactionScope
。 嗯,我想走就走的TransactionScope
,如果可能的话...
我能有这个游戏的解决方案,只有单纯DbConnection
& DbTransaction
或者这是根本不可能的还是错?
更有甚者,我发现这篇文章在这里 ,在部分指出:
“ 指定自己的交易 ”
正如你可以重写与连接的默认行为,你还可以控制交易功能。 如果你明确地创建自己的事务,调用SaveChanges不会创建一个DbTransaction。 您将不能创建一个System.Common.DbTransaction,虽然。 相反,创建自己的事务时,您需要使用System.Transaction.TransactionScope对象。
但没有交代...
我使用实体框架5.0。 能否请你帮我,以便选择正确的适合我的应用明白了吗? 这将是理想的给我看使用的一些好的模式。
提前致谢!
注:我打算,因为升级到DTC的Oracle数据提供交易的这一点。
实体框架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
。
实体框架维护其自己的交易是足够的。 但是它给你承诺或丢弃在交易中的变化的灵活性。 如果你不调用的SaveChanges()方法,那么它就会丢弃该交易。 此外,如果你使用的是相同的DbContext许多交易,那么这将是使用相同的连接。 如果你同时使用两个或更多的DbContext,那么将使用单独的连接,这是理想的情况。 这是我想提出一个很重要的一点是,这将是实体框架技术的浪费来实现自己的事务。 如果你想这样做的话,我会建议使用传统的方式自己实现DB。