Я получаю исключение
Microsoft.EntityFrameworkCore.Database.Transaction.AmbientTransactionWarning: Обнаружена внешняя транзакция
, но я понятия не имею, как обойти это это исключение. Мой код не работает, когда я звоню 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 in- база данных отношений памяти, поскольку 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
// ----------------------------------------------------------------------
// ...
};
};
}