Skip to content

Commit 1e089af

Browse files
authored
Merge pull request #1762 from Naughtyhusky/master
修复ExecuteMySqlBulkCopyAsync方法会出现空引用的异常
2 parents 7314fa1 + f287bbe commit 1e089af

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

FreeSql.DbContext/FreeSql.DbContext.xml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateTest.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
using FreeSql.DataAnnotations;
1+
using FreeSql.DataAnnotations;
22
using System;
33
using System.Collections.Generic;
44
using System.Linq;
5+
using System.Threading.Tasks;
56
using Xunit;
67

78
namespace FreeSql.Tests.MySqlConnector
@@ -11,6 +12,31 @@ public class MySqlInsertOrUpdateTest
1112

1213
IFreeSql fsql => g.mysql;
1314

15+
[Fact]
16+
public void InsertOrUpdate_ExecuteMySqlBulkCopy_Test()
17+
{
18+
fsql.Delete<tbiou02>().Where("1=1").ExecuteAffrows();
19+
var iou = fsql.InsertOrUpdate<tbiou02>().SetSource(new[] { new tbiou02 { id = 1, name = "01" }, new tbiou02 { id = 2, name = "02" }, new tbiou02 { id = 3, name = "03" }, new tbiou02 { id = 4, name = "04" } });
20+
var sql = iou.ToSql();
21+
Assert.Equal(@"INSERT INTO `tbiou02`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
22+
ON DUPLICATE KEY UPDATE
23+
`name` = VALUES(`name`)", sql);
24+
Assert.Equal(4, iou.ExecuteMySqlBulkCopy());
25+
}
26+
27+
[Fact]
28+
public async Task InsertOrUpdate_ExecuteMySqlBulkCopyAsync_Test()
29+
{
30+
fsql.Delete<tbiou02>().Where("1=1").ExecuteAffrows();
31+
var iou = fsql.InsertOrUpdate<tbiou02>().SetSource(new[] { new tbiou02 { id = 1, name = "01" }, new tbiou02 { id = 2, name = "02" }, new tbiou02 { id = 3, name = "03" }, new tbiou02 { id = 4, name = "04" } });
32+
var sql = iou.ToSql();
33+
Assert.Equal(@"INSERT INTO `tbiou02`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
34+
ON DUPLICATE KEY UPDATE
35+
`name` = VALUES(`name`)", sql);
36+
Assert.Equal(4, await iou.ExecuteMySqlBulkCopyAsync());
37+
}
38+
39+
1440
[Fact]
1541
public void InsertOrUpdate_OnePrimary()
1642
{

FreeSql/Internal/CommonProvider/UpdateProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ public static int ExecuteBulkCommand<T1>(List<T1> _source, ColumnInfo[] _tempPri
105105
#else
106106
public static Task<int> ExecuteBulkUpdateAsync<T1>(UpdateProvider<T1> update, NativeTuple<string, string, string, string, string[]> state, Func<IInsert<T1>, Task> funcBulkCopy) where T1 : class =>
107107
ExecuteBulkCommandAsync(update._source, update._tempPrimarys, update._orm, update._connection, update._transaction, update._table, state, funcBulkCopy);
108+
108109
public static Task<int> ExecuteBulkUpsertAsync<T1>(InsertOrUpdateProvider<T1> upsert, NativeTuple<string, string, string, string, string[]> state, Func<IInsert<T1>, Task> funcBulkCopy) where T1 : class =>
109110
ExecuteBulkCommandAsync(upsert._source, upsert._tempPrimarys, upsert._orm, upsert._connection, upsert._transaction, upsert._table, state, funcBulkCopy);
110111

Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,10 @@ public static void ExecuteMySqlBulkCopy<T>(this IInsert<T> that, int? bulkCopyTi
199199
#else
200200
public static Task<int> ExecuteMySqlBulkCopyAsync<T>(this IInsertOrUpdate<T> that, int? bulkCopyTimeout = null, CancellationToken cancellationToken = default) where T : class
201201
{
202-
var upsert = that as UpdateProvider<T>;
202+
var upsert = that as InsertOrUpdateProvider<T>;
203203
if (upsert._source.Any() != true || upsert._tempPrimarys.Any() == false) return Task.FromResult(0);
204204
var state = ExecuteMySqlBulkCopyState(upsert);
205-
return UpdateProvider.ExecuteBulkUpdateAsync(upsert, state, insert => insert.ExecuteMySqlBulkCopyAsync(bulkCopyTimeout, cancellationToken));
205+
return UpdateProvider.ExecuteBulkUpsertAsync(upsert, state, insert => insert.ExecuteMySqlBulkCopyAsync(bulkCopyTimeout, cancellationToken));
206206
}
207207
public static Task<int> ExecuteMySqlBulkCopyAsync<T>(this IUpdate<T> that, int? bulkCopyTimeout = null, CancellationToken cancellationToken = default) where T : class
208208
{

0 commit comments

Comments
 (0)