public async Task CrudTest() { await TestFixture.WithTempDb(async db => { await db.CreateTables(typeof(Widget), typeof(WidgetDoodad), typeof(Doodad)); var widget1 = new Widget { Value = 1 }; var widget2 = new Widget { Value = 2 }; var widget3 = new Widget { Value = 4 }; var count = await db.Write(widget1, widget2, widget3); widget1.ID.Should().BeGreaterThan(0); widget2.ID.Should().BeGreaterThan(0); widget3.ID.Should().BeGreaterThan(0); widget1.ID.Should().NotBe(widget2.ID); widget2.ID.Should().NotBe(widget3.ID); count.Should().Be(3); var widgets = await db.Read <Widget>(); foreach (var ab in widgets.Zip(new Widget[] { widget1, widget2, widget3 }, (a, b) => (a, b))) { ab.a.Should().BeEquivalentTo(ab.b); } (await db.Read <Widget>(widget2.ID)).Should().BeEquivalentTo(widget2); var doodad1 = new Doodad { Name = "First", PrimaryWidgetId = widget1.In(db) }; var doodad2 = new Doodad { Name = "Second", PrimaryWidgetId = widget3.In(db) }; await db.Write(doodad1, doodad2); await db.Write( new WidgetDoodad { DoodadId = doodad1.In(db), WidgetId = widget1.In(db), Active = true, }, new WidgetDoodad { DoodadId = doodad2.In(db), WidgetId = widget2.In(db), Active = true, }, new WidgetDoodad { DoodadId = doodad1.In(db), WidgetId = widget2.In(db), Active = true, }); var linksToWidget2 = (await db.Read <WidgetDoodad, int?>((r, p) => r.WidgetId == p, widget2.ID)).ToList(); linksToWidget2.Count.Should().Be(2); var first = await db.Dereference(linksToWidget2.First().DoodadId); var last = await db.Dereference(linksToWidget2.Last().DoodadId); if (first.ID == doodad1.ID) { last.ID.Should().Be(doodad2.ID); } else if (first.ID == doodad2.ID) { last.ID.Should().Be(doodad1.ID); } else { false.Should().BeTrue(); } }); }