Sqlite内存-TransactionScope-已检测到环境事务

问题描述 投票:0回答:1

我有例外

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

        };
    };

}
c# sqlite unit-testing transactionscope in-memory-database
1个回答
0
投票

我阻止了错误以使测试运行:

DbConnection connection = new SqliteConnection("DataSource=:memory:");
connection.OpenAsync().GetAwaiter().GetResult();
builder.UseSqlite(connection);
builder.ConfigureWarnings(x =>.Ignore(Microsoft.EntityFrameworkCore.Diagnostics.RelationalEventId.AmbientTransactionWarning));```
© www.soinside.com 2019 - 2024. All rights reserved.