【发布时间】:2014-06-16 12:54:01
【问题描述】:
我正在像这样使用 TransactionScope:
var efConnectionString = ConfigurationManager.ConnectionStrings["MainDbContext"].ConnectionString;
var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
using (var conn = new EntityConnection(efConnectionString))
{
conn.Open();
using (var context = new MainDbContext(conn, false))
{
// here are some actions, including EF data querying and modifications, and also context.Database.ExecuteSqlCommand();
context.SaveChanges();
}
}
scope.Complete();
}
当我在 Glimpse 控制台中查看时,事务计数为 0。如果我检查数据库,我可以看到事务已经发生并提交。难道我做错了什么?如何查看正确的交易数量?
EDIT1:
MainDbContext 连接字符串:
<add name="MainDbContext" connectionString="metadata=res://*/EF.EfDataModel.csdl|res://*/EF.EfDataModel.ssdl|res://*/EF.EfDataModel.msl;provider=Oracle.DataAccess.Client;provider connection string="data source=SERVER;password=PASS;persist security info=True;user id=USER"" providerName="System.Data.EntityClient" />
【问题讨论】:
-
您的连接字符串是什么样的?为什么要在
DbContext周围包裹EntityConnection? -
我添加了连接字符串。我正在使用 EntityConnection,因为我只需要 1 个连接,我需要将它传递给 DbContext。更多信息在这里msdn.microsoft.com/en-us/data/dn456843.aspx和这里stackoverflow.com/questions/6860979/dapper-transactionscope
-
我以为你在使用 EF。 EF 在上下文的数据库属性上提供了一种事务机制。
DbContext.Database.BeginTransaction(IsolationLevel.ReadCommitted);。这不是你想要的吗?您正在使用调用创建事务,而不是从其他地方获取它,因此不使用 EF 已经提供的内容没有多大意义。 EF 还将所有SaveChanges()调用包装在一个事务中。 -
是的,我正在使用 EF。但是,我有 Oracle 数据库。因此,EF6 不是一个选项,我需要使用 EF5。 DbContext.Database.BeginTransaction 在 EF6 中不可用。另外,我需要执行一些不能包含在 EF 事务中的纯 SQL 更新语句。这就是我用 TransactionScope 包装所有内容的原因。
-
它不应该是必需的,因为 EntityConnection 应该使用 DbProviderFactories,但是您是否尝试将
EntityConnection包装在new GlimpseDbConnection(new EntityConnection(efConnectionString))中?我在使用 Oracle db 时总是遇到问题。
标签: c# entity-framework transactionscope glimpse