{"record":{"id":"8166b845aebd6a9b","repo":"tursodatabase/turso","slug":"transaction-must-be-a-sqlitetransaction-8166b8","errorCode":null,"errorMessage":"Transaction must be a SqliteTransaction.","messagePattern":"Transaction must be a SqliteTransaction\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"bindings/dotnet/src/Turso.Data.Sqlite/SqliteBatch.cs","lineNumber":55,"sourceCode":"        {\n            _connection = value as SqliteConnection\n                          ?? (value is null\n                              ? null\n                              : throw new ArgumentException(\n                                  \"Connection must be a SqliteConnection.\",\n                                  nameof(value)));\n            if (_connection is not null)\n                _timeout = _connection.DefaultTimeout;\n        }\n    }\n\n    protected override DbTransaction? DbTransaction\n    {\n        get => _transaction;\n        set => _transaction = value as SqliteTransaction\n                             ?? (value is null\n                                 ? null\n                                 : throw new ArgumentException(\n                                     \"Transaction must be a SqliteTransaction.\",\n                                     nameof(value)));\n    }\n\n    public override int Timeout\n    {\n        get => _timeout;\n        set\n        {\n            ArgumentOutOfRangeException.ThrowIfNegative(value);\n            _timeout = value;\n        }\n    }\n\n    public override void Cancel()\n    {\n        _activeBatch?.Cancel();\n    }","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/tursodatabase/turso/blob/6c7252267988c76e632af00a671e4b9788dfae13/bindings/dotnet/src/Turso.Data.Sqlite/SqliteBatch.cs#L37-L73","documentation":"SqliteBatch.Transaction accepts only a Turso SqliteTransaction; the setter downcasts and throws ArgumentException when a non-null DbTransaction of another type is assigned. Unlike Connection, a null assignment is accepted and clears the transaction.","triggerScenarios":"Assigning a transaction obtained from a different provider (e.g. Microsoft.Data.Sqlite SqliteTransaction, NpgsqlTransaction) or from DbConnection.BeginTransaction() on a non-Turso connection to SqliteBatch.DbTransaction/Transaction.","commonSituations":"Mixing ADO.NET provider packages; storing the transaction in a base-type (DbTransaction) variable or repository abstraction and passing it back to the batch; refactor from Microsoft.Data.Sqlite to Turso without updating transaction creation.","solutions":["Begin the transaction on the same Turso connection: batch.Transaction = (SqliteTransaction)connection.BeginTransaction(), or use connection.BeginTransaction() typed as SqliteTransaction","Ensure the variable holding the transaction is typed Turso.Data.Sqlite.SqliteTransaction, not DbTransaction","Remove duplicate/conflicting provider packages so only one SqliteTransaction type is in scope"],"exampleFix":"// before\nDbTransaction tx = otherConnection.BeginTransaction();\nbatch.Transaction = tx; // ArgumentException\n// after\nvar tx = connection.BeginTransaction(); // Turso SqliteTransaction\nbatch.Transaction = tx;","handlingStrategy":"type-guard","validationCode":"if (tx is not Turso.Data.Sqlite.SqliteTransaction)\n    throw new ArgumentException($\"Expected Turso SqliteTransaction, got {tx?.GetType().FullName}\");","typeGuard":"static bool IsTursoSqliteTransaction(DbTransaction? t) => t is Turso.Data.Sqlite.SqliteTransaction;","tryCatchPattern":"try { batch.Transaction = tx; }\ncatch (ArgumentException ex) when (ex.ParamName == \"value\") { /* recreate tx from the same Turso connection */ }","preventionTips":["Always begin transactions on the same Turso connection the batch uses","Keep transaction variables typed as SqliteTransaction, not DbTransaction","Avoid mixing provider packages in one project"],"tags":["csharp","dotnet","argument","type-mismatch","transaction"],"backgroundTag":"invalid-argument-value","analyzedSha":"6c7252267988c76e632af00a671e4b9788dfae13","analyzedAt":"2026-09-06T07:15:26.990Z","contentChangedAt":"2026-09-06T07:15:26.990Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}