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();