我有例外
Microsoft.EntityFrameworkCore.Database.Transaction.AmbientTransaction警告:已检测到环境交易]
但是我不知道如何解决此异常。当我在SaveChanges()
内部调用TransactionScope
时,我的代码失败。可能是因为TransactionScope
本身在SQLite context
事务内部,但是如何处理此问题?
我要测试的方法
它使用TransactionScope,因为我想确保在我和他一起操作时,加载的对象(Request
类)不会改变。
public void Handle(Create cmd)
{
// Wrap via transaction
using (var transaction = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }))
{
// Load request object from repository.
Request request = _repository.Find(cmd.RequestId);
// Create detail object
var detail = new Detail(requestId: cmd.RequestId);
// Add created detail object into Request object
request.CreateDetail(detail);
// Save request into repository.
_repository.SaveChanges(); // <--- HERE IS THE EXCEPTION THROWN
// Commit transaction
transaction.Complete();
}
}
我要执行的测试方法它使用SQLite内存中关系数据库,因为TransactionScope不支持非关系数据库。
[Fact]
public void Create()
{
// Arrange
// ---------------------------------------------------------------------
var request = new Request();
using (var connection = new SqliteConnection("DataSource=:memory:"))
{
connection.Open();
var options = new DbContextOptionsBuilder<SamplesContext>()
.UseSqlite(connection)
.Options;
using (var context = new SamplesContext(options))
{
context.Database.EnsureCreated();
var service = SetupDetailService(context);
context.Request.Add(request);
context.SaveChanges();
var storedRequest = context.Request.FirstOrDefault();
var createCommand = new Create(requestId: Convert.ToInt32(storedRequest.Id));
// Act
// ---------------------------------------------------------------------
service.Handle(createCommand); // <--- HERE IS THE EXCEPTION THROWN
context.SaveChanges();
// Assert
// ----------------------------------------------------------------------
// ...
};
};
}
我阻止了错误以使测试运行:
DbConnection connection = new SqliteConnection("DataSource=:memory:");
connection.OpenAsync().GetAwaiter().GetResult();
builder.UseSqlite(connection);
builder.ConfigureWarnings(x =>.Ignore(Microsoft.EntityFrameworkCore.Diagnostics.RelationalEventId.AmbientTransactionWarning));```