Schipper.Io.Sqlite ships the runtime and a Roslyn generator in one package. No reflection, no runtime SQL building, no IQueryable. Native AOT stays clean because the generator never enters lib/.
Extra columns under VerifyOnly are fatal. A late [Unique] stays. Scale lives in the schema hash.
Get, query, stream, insert, version-checked update, upsert, delete. Bound filters. Keyset pages with HasMore.
Missing constructors, private setters, bad [Scale], illegal key types. Errors land on the row type, not a generated file.
Tables named Order and columns named Group prepare. C# keywords get @ in the emitted source.
Nullable upserts use COALESCE and cannot clear NULL; UpdateAsync can.
[Table("Widgets")] public sealed class WidgetRow : AuditedRow { [Key] public string Id { get; set; } = ""; public string Name { get; set; } = ""; } var db = new SqliteDb("Data Source=app.db"); await Database.ApplyAsync(db); await using var session = await db.BeginAsync(user: "ada"); await widgets.InsertAsync(session, new WidgetRow { Id = "w1", Name = "Nebula" }); await session.CommitAsync();