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(); db.Items.Add(new Item { Name = "rune" }); await db.SaveChangesAsync(); db.ChangeTracker.Clear(); var detached = await db.Items.AsNoTracking().SingleAsync(); Check(!db.ChangeTracker.Entries().Any(), "untracked result"); detached.Name = "draft"; Check(await db.SaveChangesAsync() == 0, "no pending tracked update"); } await using (var verify = new LabDb(options)) { Check((await verify.Items.AsNoTracking().SingleAsync()).Name == "rune", "untracked edit not saved"); Console.WriteLine("stored:rune"); var tracked = await verify.Items.SingleAsync(); tracked.Name = "saved"; await verify.SaveChangesAsync(); } await using (var verify = new LabDb(options)) { Check((await verify.Items.SingleAsync()).Name == "saved", "tracked edit saved"); Console.WriteLine("stored:saved"); } static void Check(bool condition, string name) { if (!condition) throw new InvalidOperationException("CHECK: " + name); }