.Net Core Connection 当前已登记事务
.Net Core Connection currently has transaction enlisted
我正在使用 .Net Core 2.1 编写集成测试我有一个看起来像这样的测试:
private TransactionScope scope;
[TestCleanup]
public void TestCleanup()
{
this.scope.Dispose();
}
[TestInitialize]
public void VerifyUsersHaveBeenSeeded()
{
var transactionOptions = new TransactionOptions {
IsolationLevel = IsolationLevel.ReadCommitted
};
//I've also tried using TransactionScopeOption.Required
this.scope = new TransactionScope(TransactionScopeOption.RequiresNew,
transactionOptions);
}
//Note I am using an MDF file during Testing.
protected AstootContext GetContext()
{
var optionsBuilder = new DbContextOptionsBuilder<AstootContext>();
optionsBuilder.UseSqlServer(this.ASTOOT_CONNECTION_STRING);
var context = new AstootContext(optionsBuilder.Options);
return context;
}
[TestMethod]
public async Task RestEzServiceVerifyUpdate()
{
var context = this.GetContext();
var expectedResult = context.Users.First();
var restEzService = GetDefaultService<User, UserDTO>(context);
var key = new object[] { expectedResult.Id };
var dto = await restEzService.Get(key);
var updatedName = "Updated";
dto.FirstName = updatedName;
var updatedDTO = await restEzService.Update(key, dto);
Assert.IsTrue(updatedDTO.FirstName == updatedName);
updatedDTO.Should().BeEquivalentTo(expectedResult,
o => o.Excluding(x => x.UniqueIdentifier).Excluding(x => x.FirstName));
context.Dispose();
}
更新方法调用:
var entity = await this._context.FindAsync(id).ConfigureAwait(false);
this.applyDTOToEntity(entity, dto);
await this._context.SaveChangesAsync().ConfigureAwait(false);
当它调用保存更改时出现错误:
System.InvalidOperationException: Connection currently has transaction enlisted. Finish current transaction and retry.
我从上下文调用的唯一地方是 1. 在测试中获得预期结果,2. 获取更新的实体,3. 保存更改。
我将 transactionScopeOptions 设置为 Requires New,为什么会出现此错误?
TransactionScopeOption.RequiresNew
尝试创建新事务。您确定 new TransactionScope
.
点没有交易吗
也许,您需要将其替换为TransactionScopeOption.Required
您还使用 async/await,因此添加到范围选项 TransactionScopeAsyncFlowOption.Enabled
:
using (var scope = new TransactionScope(... ,
TransactionScopeAsyncFlowOption.Enabled))
我正在使用 .Net Core 2.1 编写集成测试我有一个看起来像这样的测试:
private TransactionScope scope;
[TestCleanup]
public void TestCleanup()
{
this.scope.Dispose();
}
[TestInitialize]
public void VerifyUsersHaveBeenSeeded()
{
var transactionOptions = new TransactionOptions {
IsolationLevel = IsolationLevel.ReadCommitted
};
//I've also tried using TransactionScopeOption.Required
this.scope = new TransactionScope(TransactionScopeOption.RequiresNew,
transactionOptions);
}
//Note I am using an MDF file during Testing.
protected AstootContext GetContext()
{
var optionsBuilder = new DbContextOptionsBuilder<AstootContext>();
optionsBuilder.UseSqlServer(this.ASTOOT_CONNECTION_STRING);
var context = new AstootContext(optionsBuilder.Options);
return context;
}
[TestMethod]
public async Task RestEzServiceVerifyUpdate()
{
var context = this.GetContext();
var expectedResult = context.Users.First();
var restEzService = GetDefaultService<User, UserDTO>(context);
var key = new object[] { expectedResult.Id };
var dto = await restEzService.Get(key);
var updatedName = "Updated";
dto.FirstName = updatedName;
var updatedDTO = await restEzService.Update(key, dto);
Assert.IsTrue(updatedDTO.FirstName == updatedName);
updatedDTO.Should().BeEquivalentTo(expectedResult,
o => o.Excluding(x => x.UniqueIdentifier).Excluding(x => x.FirstName));
context.Dispose();
}
更新方法调用:
var entity = await this._context.FindAsync(id).ConfigureAwait(false);
this.applyDTOToEntity(entity, dto);
await this._context.SaveChangesAsync().ConfigureAwait(false);
当它调用保存更改时出现错误:
System.InvalidOperationException: Connection currently has transaction enlisted. Finish current transaction and retry.
我从上下文调用的唯一地方是 1. 在测试中获得预期结果,2. 获取更新的实体,3. 保存更改。
我将 transactionScopeOptions 设置为 Requires New,为什么会出现此错误?
TransactionScopeOption.RequiresNew
尝试创建新事务。您确定 new TransactionScope
.
也许,您需要将其替换为TransactionScopeOption.Required
您还使用 async/await,因此添加到范围选项 TransactionScopeAsyncFlowOption.Enabled
:
using (var scope = new TransactionScope(... ,
TransactionScopeAsyncFlowOption.Enabled))