diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 9c6cd88b..743835e4 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -532,5 +532,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/MySqlConnectionExtensionsTest.cs b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/MySqlConnectionExtensionsTest.cs index 7f4a3296..fa1386b9 100644 --- a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/MySqlConnectionExtensionsTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/MySqlConnectionExtensionsTest.cs @@ -30,6 +30,21 @@ namespace FreeSql.Tests.AdoNetExtensions.MySqlConnectionExtensions { Assert.Equal(1, affrows); } [Fact] + public void InsertOrUpdate() + { + var affrows = 0; + using (var conn = new MySqlConnection(_connectString)) + { + var item = new TestConnectionExt { title = "testinsert" }; + affrows = conn.Insert().AppendData(item).ExecuteAffrows(); + Assert.Equal(1, affrows); + item.title = "testinsertorupdate"; + var affrows2 = conn.InsertOrUpdate().SetSource(item).ExecuteAffrows(); + conn.Close(); + } + Assert.Equal(1, affrows); + } + [Fact] public void Update() { var affrows = 0; using (var conn = new MySqlConnection(_connectString)) { diff --git a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/NpgsqlConnectionExtensionsTest.cs b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/NpgsqlConnectionExtensionsTest.cs index 18b70be9..542e083a 100644 --- a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/NpgsqlConnectionExtensionsTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/NpgsqlConnectionExtensionsTest.cs @@ -23,6 +23,21 @@ namespace FreeSql.Tests.AdoNetExtensions.NpgsqlConnectionExtensions { Assert.Equal(1, affrows); } [Fact] + public void InsertOrUpdate() + { + var affrows = 0; + using (var conn = new NpgsqlConnection(_connectString)) + { + var item = new TestConnectionExt { title = "testinsert" }; + affrows = conn.Insert().AppendData(item).ExecuteAffrows(); + Assert.Equal(1, affrows); + item.title = "testinsertorupdate"; + var affrows2 = conn.InsertOrUpdate().SetSource(item).ExecuteAffrows(); + conn.Close(); + } + Assert.Equal(1, affrows); + } + [Fact] public void Update() { var affrows = 0; using (var conn = new NpgsqlConnection(_connectString)) { diff --git a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/OracleConnectionExtensionsTest.cs b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/OracleConnectionExtensionsTest.cs index faec49a6..359e5451 100644 --- a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/OracleConnectionExtensionsTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/OracleConnectionExtensionsTest.cs @@ -23,6 +23,21 @@ namespace FreeSql.Tests.AdoNetExtensions.OracleConnectionExtensions { Assert.Equal(1, affrows); } [Fact] + public void InsertOrUpdate() + { + var affrows = 0; + using (var conn = new OracleConnection(_connectString)) + { + var item = new TestConnectionExt { title = "testinsert" }; + affrows = conn.Insert().AppendData(item).ExecuteAffrows(); + Assert.Equal(1, affrows); + item.title = "testinsertorupdate"; + var affrows2 = conn.InsertOrUpdate().SetSource(item).ExecuteAffrows(); + conn.Close(); + } + Assert.Equal(1, affrows); + } + [Fact] public void Update() { var affrows = 0; using (var conn = new OracleConnection(_connectString)) { diff --git a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/SQLiteConnectionExtensionsTest.cs b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/SQLiteConnectionExtensionsTest.cs index 9ee8faa0..4352555b 100644 --- a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/SQLiteConnectionExtensionsTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/SQLiteConnectionExtensionsTest.cs @@ -25,6 +25,21 @@ namespace FreeSql.Tests.AdoNetExtensions.SQLiteConnectionExtensions { Assert.Equal(1, affrows); } [Fact] + public void InsertOrUpdate() + { + var affrows = 0; + using (var conn = new SQLiteConnection(_connectString)) + { + var item = new TestConnectionExt { title = "testinsert" }; + affrows = conn.Insert().AppendData(item).ExecuteAffrows(); + Assert.Equal(1, affrows); + item.title = "testinsertorupdate"; + var affrows2 = conn.InsertOrUpdate().SetSource(item).ExecuteAffrows(); + conn.Close(); + } + Assert.Equal(1, affrows); + } + [Fact] public void Update() { var affrows = 0; using (var conn = new SQLiteConnection(_connectString)) { diff --git a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/SqlConnectionExtensionsTest.cs b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/SqlConnectionExtensionsTest.cs index ca6a80ea..945af494 100644 --- a/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/SqlConnectionExtensionsTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/AdoNetExtensions/SqlConnectionExtensionsTest.cs @@ -23,6 +23,21 @@ namespace FreeSql.Tests.AdoNetExtensions.SqlConnectionExtensions { Assert.Equal(1, affrows); } [Fact] + public void InsertOrUpdate() + { + var affrows = 0; + using (var conn = new SqlConnection(_connectString)) + { + var item = new TestConnectionExt { title = "testinsert" }; + affrows = conn.Insert().AppendData(item).ExecuteAffrows(); + Assert.Equal(1, affrows); + item.title = "testinsertorupdate"; + var affrows2 = conn.InsertOrUpdate().SetSource(item).ExecuteAffrows(); + conn.Close(); + } + Assert.Equal(1, affrows); + } + [Fact] public void Update() { var affrows = 0; using (var conn = new SqlConnection(_connectString)) { diff --git a/FreeSql/Extensions/AdoNetExtensions.cs b/FreeSql/Extensions/AdoNetExtensions.cs index ac63b308..451d7c7c 100644 --- a/FreeSql/Extensions/AdoNetExtensions.cs +++ b/FreeSql/Extensions/AdoNetExtensions.cs @@ -13,7 +13,7 @@ namespace FreeSql static object _dicCurdLock = new object(); static IFreeSql GetCrud(IDbConnection dbconn) { - if (dbconn == null) throw new ArgumentNullException($"{nameof(dbconn)} 不能为 null"); ; + if (dbconn == null) throw new ArgumentNullException($"{nameof(dbconn)} 不能为 null"); Type dbconType = dbconn.GetType(); var connType = dbconType.UnderlyingSystemType; if (_dicCurd.TryGetValue(connType, out var fsql)) return fsql; diff --git a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs index 92c5b536..7799c8ff 100644 --- a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs @@ -202,9 +202,12 @@ namespace FreeSql.Internal.CommonProvider try { if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } - if (_transaction != null) + if (_transaction != null || _orm.Ado.MasterPool == null) { _source = ss.Item1; _SplitSourceByIdentityValueIsNullFlag = 1; @@ -305,9 +308,12 @@ namespace FreeSql.Internal.CommonProvider try { if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } - if (_transaction != null) + if (_transaction != null || _orm.Ado.MasterPool == null) { _source = ss.Item1; _SplitSourceByIdentityValueIsNullFlag = 1; diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 1d394457..2d03379b 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -219,7 +219,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteAffrows", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -237,6 +240,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = _orm.Ado.MasterPool.Get()) { _transaction = conn.Value.BeginTransaction(); @@ -294,7 +298,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteIdentity", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -313,6 +320,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = _orm.Ado.MasterPool.Get()) { _transaction = conn.Value.BeginTransaction(); @@ -371,7 +379,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteInserted", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -389,6 +400,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = _orm.Ado.MasterPool.Get()) { _transaction = conn.Value.BeginTransaction(); diff --git a/FreeSql/Internal/CommonProvider/InsertProviderAsync.cs b/FreeSql/Internal/CommonProvider/InsertProviderAsync.cs index d738874a..92f5ff79 100644 --- a/FreeSql/Internal/CommonProvider/InsertProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/InsertProviderAsync.cs @@ -33,7 +33,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteAffrowsAsync", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -51,6 +54,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = await _orm.Ado.MasterPool.GetAsync()) { _transaction = conn.Value.BeginTransaction(); @@ -108,7 +112,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteIdentityAsync", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -127,6 +134,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = await _orm.Ado.MasterPool.GetAsync()) { _transaction = conn.Value.BeginTransaction(); @@ -185,7 +193,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteInsertedAsync", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -203,6 +214,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = await _orm.Ado.MasterPool.GetAsync()) { _transaction = conn.Value.BeginTransaction(); diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 1de0b502..7ffa1982 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -158,7 +158,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteAffrows", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -176,6 +179,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = _orm.Ado.MasterPool.Get()) { _transaction = conn.Value.BeginTransaction(); @@ -228,7 +232,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteUpdated", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -246,6 +253,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = _orm.Ado.MasterPool.Get()) { _transaction = conn.Value.BeginTransaction(); diff --git a/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs b/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs index 4d0194aa..a3593472 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs @@ -29,7 +29,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteAffrowsAsync", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -47,6 +50,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = await _orm.Ado.MasterPool.GetAsync()) { _transaction = conn.Value.BeginTransaction(); @@ -98,7 +102,10 @@ namespace FreeSql.Internal.CommonProvider return ret; } if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); + { + var threadTransaction = _orm.Ado.TransactionCurrentThread; + if (threadTransaction != null) this.WithTransaction(threadTransaction); + } var before = new Aop.TraceBeforeEventArgs("SplitExecuteUpdatedAsync", null); _orm.Aop.TraceBeforeHandler?.Invoke(this, before); @@ -116,6 +123,7 @@ namespace FreeSql.Internal.CommonProvider } else { + if (_orm.Ado.MasterPool == null) throw new Exception("Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决"); using (var conn = await _orm.Ado.MasterPool.GetAsync()) { _transaction = conn.Value.BeginTransaction();