using System; using System.Linq; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; await using var connection = new SqliteConnection("Data Source=:memory:;Foreign Keys=True"); await connection.OpenAsync(); var options = new DbContextOptionsBuilder().UseSqlite(connection).Options; await using (var db = new LabDb(options)) { await db.Database.EnsureCreatedAsync(); await using var transaction = await db.Database.BeginTransactionAsync(); db.Items.Add(new Item { Name = "A" }); await db.SaveChangesAsync(); db.Items.Add(new Item { Name = "B" }); await db.SaveChangesAsync(); await transaction.RollbackAsync(); } await using (var verify = new LabDb(options)) { Check(await verify.Items.CountAsync() == 0, "rollback stored count"); Console.WriteLine("after-rollback:0"); } await using (var db = new LabDb(options)) { await using var transaction = await db.Database.BeginTransactionAsync(); db.Items.Add(new Item { Name = "C" }); await db.SaveChangesAsync(); await transaction.CommitAsync(); } await using (var verify = new LabDb(options)) { Check((await verify.Items.SingleAsync()).Name == "C", "commit visible"); Console.WriteLine("after-commit:C"); } static void Check(bool condition, string name) { if (!condition) throw new InvalidOperationException("CHECK: " + name); }