【发布时间】:2018-07-09 06:27:12
【问题描述】:
EF Core 2.1 引入了对环境事务的支持。 sample创建一个新的SqlConnection,手动打开并传递给DbContext:
using (var scope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
{
var connection = new SqlConnection(connectionString);
connection.Open();
try
{
// Run raw ADO.NET command in the transaction
var command = connection.CreateCommand();
command.CommandText = "DELETE FROM dbo.Blogs";
command.ExecuteNonQuery();
// Run an EF Core command in the transaction
var options = new DbContextOptionsBuilder<BloggingContext>()
.UseSqlServer(connection)
.Options;
using (var context = new BloggingContext(options))
{
context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
context.SaveChanges();
}
// Commit transaction if all commands succeed, transaction will auto-rollback
// when disposed if either commands fails
scope.Complete();
}
catch (System.Exception)
{
// TODO: Handle failure
}
}
虽然没有给connection.Close()打电话。
这部分只是在示例中丢失,还是在处理TransactionScope 或DbContext 时以某种方式自动关闭连接?
编辑:对 Close/Dispose 的调用丢失。我提交了拉取请求,文档现已更新。
【问题讨论】:
-
您必须对其进行测试,例如使用 SQL Server Profiler - 必须在 内部 一个事务中创建一个连接才能自动登记。否则你必须显式调用
Enlist()。在事务本身提交之前连接不能关闭,否则提交/回滚将是不可能的。 也许当 TransactionScope 超出范围时,一些魔术代码负责实际关闭连接。不过,Maybes 并不适合数据访问代码 -
这就是我来这里询问的原因。
-
我会避免这样的代码。即使该魔法代码存在,您也必须确保在
TransactionScope内始终调用此代码以启用魔法。如果其他开发人员甚至您忘记了它,您将开始泄漏连接。 -
使用需要在
using块中调用context.Database.OpenConnection()和context.Database.CloseConnection()
标签: c# entity-framework-core transactionscope