sqlite-adonet について
Microsoft.Data.Sqlite の ADO.NET プロバイダー層の動作を調査・テストする開発スキルです。EF Core の抽象ではなく、コマンドとトランザクションのライフサイクルに焦点を当てます。
主な機能
- 01ADO.NET コマンドのライフサイクル指針
- 02接続終了時の SQLite ステートメント解放
- 03再試行可能な COMMIT 失敗の動作
- 04トランザクション解放とロールバックのテスト
活用シーン
- 01接続再開後のコマンド再利用の調査
- 02COMMIT 失敗と解放エラーの個別テスト
- 03接続の終了・再開動作の診断
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dotnet/ efcore --skill sqlite-adonetインストール後、Claude Code で/sqlite-adonetを入力して読み込まれたか確認します。
詳細
Microsoft.Data.Sqlite
EF Core に依存しない、src/Microsoft.Data.Sqlite.Core/ にあるスタンドアロンの ADO.NET プロバイダーです。System.Data.Common の抽象化を実装します。
主な実装の詳細
- 静的コンストラクターで
SQLitePCL.Batteries_V2.Init()をリフレクション経由で呼び出します CreateFunction()/CreateAggregate()のオーバーロードは T4 テンプレート(.ttファイル)から生成されます
コマンドのライフサイクル
SqliteConnection は、関連付けられたコマンドを弱参照として追跡します。開いている接続を閉じる際、ネイティブ接続を閉じる前に、追跡対象のうち有効なすべてのコマンドを破棄します。コマンドの破棄時には、準備済みステートメントが解放され、コマンドの登録が解除されます。接続のクローズ/再オープンに関する報告を診断する際は、EF Core プロバイダーの抽象化ではなく、この所有関係の経路と System.Data.Common の契約に基づいてください。
クローズしても、コマンドのマネージド構成や接続への参照は消去されません。同じコマンドオブジェクトを、接続の再オープン後に使用すると、新しいハンドルに対して新しいネイティブステートメントが準備されます。このライフサイクルをたどった後も報告された動作が再現する場合に限り、リグレッションテストを追加してください。
トランザクションの完了
COMMIT に失敗すると、SQLite のトランザクションが有効なままになり、再試行できる場合があります。Complete() を呼び出したり、トランザクションレベルの再試行を追加したりしないでください。SqliteCommand はすでに、接続の ExecuteNonQuery 経由でビジー/ロックの結果を再試行します。
破棄中のロールバックで例外が発生した場合でも、マネージドトランザクションを切り離す必要があるため、finally 内の Complete() は維持してください。コミット失敗と Dispose()/DisposeAsync() の失敗は分けてテストしてください。元の例外を保持し、破棄後に新しいトランザクションを開始できることを検証してください。