67

I'm using an EF Core in-memory database and I'm trying to run a unit test on a method that uses transactions:

using (var transaction = await _context.Database.BeginTransactionAsync())
{
    _context.Update(item);
    result = await _context.SaveChangesAsync();

    // some other stuff

    transaction.Commit();
}

However, I'm getting this error from the test runner:

System.InvalidOperationException: Warning as error exception for warning 'InMemoryEventId.TransactionIgnoredWarning': Transactions are not supported by the in-memory store. See http://go.microsoft.com/fwlink/?LinkId=800142 To suppress this Exception use the DbContextOptionsBuilder.ConfigureWarnings API. ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.

How do I suppress that error?

wonea
  • 4,783
  • 17
  • 86
  • 139
tomRedox
  • 28,092
  • 24
  • 117
  • 154

2 Answers2

140

In the code where you declare the in-memory database, configure the context to ignore that error as follows:

public MyDbContext GetContextWithInMemoryDb()
{
    var options = new DbContextOptionsBuilder<MyDbContext>()
        .UseInMemoryDatabase(Guid.NewGuid().ToString())
        // don't raise the error warning us that the in memory db doesn't support transactions
        .ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning))
        .Options;

    return new MyDbContext(options); 
}
wonea
  • 4,783
  • 17
  • 86
  • 139
tomRedox
  • 28,092
  • 24
  • 117
  • 154
14

I used the answer from @tomRedox but varied it for use in an ASP.NET Core 2.0 startup.cs file.

services.AddDbContext<MyDbContext>(options =>
{
    options.UseInMemoryDatabase("TestDb");
    options.ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning));
});
wonea
  • 4,783
  • 17
  • 86
  • 139
CrispinH
  • 1,899
  • 4
  • 23
  • 38