Sqlite in-memory - TransactionScope - обнаружена внешняя транзакция - PullRequest
0 голосов
/ 05 февраля 2020

Я получаю исключение

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
            // ----------------------------------------------------------------------
            // ...

        };
    };

}

1 Ответ

0 голосов
/ 26 февраля 2020

Я заблокировал ошибки, чтобы запустить тесты:

DbConnection connection = new SqliteConnection("DataSource=:memory:");
connection.OpenAsync().GetAwaiter().GetResult();
builder.UseSqlite(connection);
builder.ConfigureWarnings(x =>.Ignore(Microsoft.EntityFrameworkCore.Diagnostics.RelationalEventId.AmbientTransactionWarning));```
...