Skip to content

Commit 4c90ebd

Browse files
author
fabien.menager
committed
Revert "Do not insert NumericEnumValue because of linq2db not handling it right with provider specific import and simplify benchmark"
This reverts commit 0ba0264.
1 parent 0ba0264 commit 4c90ebd

7 files changed

Lines changed: 111 additions & 69 deletions

File tree

tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/LibComparator.RawInsert.cs

Lines changed: 11 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
using Microsoft.Data.Sqlite;
55
using Microsoft.EntityFrameworkCore;
66

7-
using MySqlConnector;
8-
97
using Npgsql;
108

119
namespace PhenX.EntityFrameworkCore.BulkInsert.Benchmark;
@@ -27,7 +25,8 @@ private void RawInsertPostgreSql()
2725
"Identifier",
2826
"CreatedAt",
2927
"UpdatedAt",
30-
"StringEnumValue"
28+
"StringEnumValue",
29+
"NumericEnumValue"
3130
) FROM STDIN (FORMAT BINARY)
3231
""";
3332

@@ -41,6 +40,7 @@ private void RawInsertPostgreSql()
4140
writer.Write(entity.CreatedAt);
4241
writer.Write(entity.UpdatedAt);
4342
writer.Write(entity.StringEnumValue.ToString());
43+
writer.Write((int)entity.NumericEnumValue);
4444
}
4545

4646
writer.Complete();
@@ -63,8 +63,9 @@ private void RawInsertSqlite()
6363
"Identifier",
6464
"CreatedAt",
6565
"UpdatedAt",
66-
"StringEnumValue"
67-
) VALUES (@Name, @Price, @Identifier, @CreatedAt, @UpdatedAt, @StringEnumValue)
66+
"StringEnumValue",
67+
"NumericEnumValue"
68+
) VALUES (@Name, @Price, @Identifier, @CreatedAt, @UpdatedAt, @StringEnumValue, @NumericEnumValue)
6869
""";
6970

7071
command.Parameters.Add(new SqliteParameter("@Name", DbType.String));
@@ -73,6 +74,7 @@ private void RawInsertSqlite()
7374
command.Parameters.Add(new SqliteParameter("@CreatedAt", DbType.DateTime));
7475
command.Parameters.Add(new SqliteParameter("@UpdatedAt", DbType.DateTime2));
7576
command.Parameters.Add(new SqliteParameter("@StringEnumValue", DbType.String));
77+
command.Parameters.Add(new SqliteParameter("@NumericEnumValue", DbType.Int32));
7678

7779
foreach (var entity in data)
7880
{
@@ -82,6 +84,7 @@ private void RawInsertSqlite()
8284
command.Parameters["@CreatedAt"].Value = entity.CreatedAt;
8385
command.Parameters["@UpdatedAt"].Value = entity.UpdatedAt;
8486
command.Parameters["@StringEnumValue"].Value = entity.StringEnumValue.ToString();
87+
command.Parameters["@NumericEnumValue"].Value = (int)entity.NumericEnumValue;
8588

8689
command.ExecuteNonQuery();
8790
}
@@ -109,6 +112,7 @@ private void RawInsertSqlServer()
109112
bulkCopy.ColumnMappings.Add("CreatedAt", "CreatedAt");
110113
bulkCopy.ColumnMappings.Add("UpdatedAt", "UpdatedAt");
111114
bulkCopy.ColumnMappings.Add("StringEnumValue", "StringEnumValue");
115+
bulkCopy.ColumnMappings.Add("NumericEnumValue", "NumericEnumValue");
112116

113117
var dataTable = new DataTable();
114118
dataTable.Columns.Add("Name", typeof(string));
@@ -117,6 +121,7 @@ private void RawInsertSqlServer()
117121
dataTable.Columns.Add("CreatedAt", typeof(DateTime));
118122
dataTable.Columns.Add("UpdatedAt", typeof(DateTimeOffset));
119123
dataTable.Columns.Add("StringEnumValue", typeof(string));
124+
dataTable.Columns.Add("NumericEnumValue", typeof(int));
120125

121126
foreach (var entity in data)
122127
{
@@ -127,58 +132,7 @@ private void RawInsertSqlServer()
127132
row["CreatedAt"] = entity.CreatedAt;
128133
row["UpdatedAt"] = entity.UpdatedAt;
129134
row["StringEnumValue"] = entity.StringEnumValue.ToString();
130-
dataTable.Rows.Add(row);
131-
132-
if (dataTable.Rows.Count >= 50_000)
133-
{
134-
bulkCopy.WriteToServer(dataTable);
135-
dataTable.Clear();
136-
}
137-
}
138-
139-
if (dataTable.Rows.Count > 0)
140-
{
141-
bulkCopy.WriteToServer(dataTable);
142-
}
143-
}
144-
145-
private void RawInsertMySql()
146-
{
147-
var connection = (MySqlConnection)DbContext.Database.GetDbConnection();
148-
if (connection.State != ConnectionState.Open)
149-
{
150-
connection.Open();
151-
}
152-
153-
var bulkCopy = new MySqlBulkCopy(connection);
154-
155-
bulkCopy.DestinationTableName = nameof(TestEntity);
156-
bulkCopy.BulkCopyTimeout = 60;
157-
158-
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(0, "Name"));
159-
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(1, "Price"));
160-
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(2, "Identifier"));
161-
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(3, "CreatedAt"));
162-
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(4, "UpdatedAt"));
163-
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(5, "StringEnumValue"));
164-
165-
var dataTable = new DataTable();
166-
dataTable.Columns.Add("Name", typeof(string));
167-
dataTable.Columns.Add("Price", typeof(decimal));
168-
dataTable.Columns.Add("Identifier", typeof(Guid));
169-
dataTable.Columns.Add("CreatedAt", typeof(DateTime));
170-
dataTable.Columns.Add("UpdatedAt", typeof(DateTimeOffset));
171-
dataTable.Columns.Add("StringEnumValue", typeof(string));
172-
173-
foreach (var entity in data)
174-
{
175-
var row = dataTable.NewRow();
176-
row["Name"] = entity.Name;
177-
row["Price"] = entity.Price;
178-
row["Identifier"] = entity.Identifier;
179-
row["CreatedAt"] = entity.CreatedAt;
180-
row["UpdatedAt"] = entity.UpdatedAt;
181-
row["StringEnumValue"] = entity.StringEnumValue.ToString();
135+
row["NumericEnumValue"] = (int)entity.NumericEnumValue;
182136
dataTable.Rows.Add(row);
183137

184138
if (dataTable.Rows.Count >= 50_000)

tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/LibComparator.cs

Lines changed: 69 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
using BenchmarkDotNet.Attributes;
2-
using BenchmarkDotNet.Engines;
32

43
using DotNet.Testcontainers.Containers;
54

65
using EFCore.BulkExtensions;
76

8-
using LinqToDB.Data;
97
using LinqToDB.EntityFrameworkCore;
108

9+
using Microsoft.Data.SqlClient;
10+
using Microsoft.Data.Sqlite;
11+
using Microsoft.EntityFrameworkCore;
12+
13+
using MySqlConnector;
14+
15+
using Npgsql;
16+
1117
using PhenX.EntityFrameworkCore.BulkInsert.Extensions;
1218

1319
namespace PhenX.EntityFrameworkCore.BulkInsert.Benchmark;
1420

15-
[MemoryDiagnoser]
16-
[SimpleJob(RunStrategy.ColdStart, launchCount: 1, warmupCount: 0, iterationCount: 5)]
1721
public abstract partial class LibComparator
1822
{
1923
[Params(500_000/*, 1_000_000/*, 10_000_000*/)]
@@ -31,6 +35,7 @@ public void IterationSetup()
3135
Price = (decimal)(i * 0.1),
3236
Identifier = Guid.NewGuid(),
3337
StringEnumValue = (StringEnum)(i % 2),
38+
NumericEnumValue = (NumericEnum)(i % 2),
3439
}).ToList();
3540

3641
ConfigureDbContext();
@@ -95,10 +100,7 @@ public void RawInsert()
95100
[Benchmark]
96101
public async Task Linq2Db()
97102
{
98-
await DbContext.BulkCopyAsync(new BulkCopyOptions
99-
{
100-
BulkCopyType = BulkCopyType.ProviderSpecific,
101-
}, data);
103+
await DbContext.BulkCopyAsync(data);
102104
}
103105

104106
[Benchmark]
@@ -133,10 +135,65 @@ await DbContext.BulkInsertAsync(data, options =>
133135
// });
134136
// }
135137

136-
[Benchmark]
137-
public async Task EFCore_SaveChanges()
138+
// [Benchmark]
139+
// public async Task EFCore_SaveChanges()
140+
// {
141+
// DbContext.AddRange(data);
142+
// await DbContext.SaveChangesAsync();
143+
// }
144+
145+
private void RawInsertMySql()
138146
{
139-
DbContext.AddRange(data);
140-
await DbContext.SaveChangesAsync();
147+
var connection = (MySqlConnection)DbContext.Database.GetDbConnection();
148+
if (connection.State != ConnectionState.Open)
149+
{
150+
connection.Open();
151+
}
152+
153+
var bulkCopy = new MySqlBulkCopy(connection);
154+
155+
bulkCopy.DestinationTableName = nameof(TestEntity);
156+
bulkCopy.BulkCopyTimeout = 60;
157+
158+
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(0, "Name"));
159+
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(1, "Price"));
160+
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(2, "Identifier"));
161+
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(3, "CreatedAt"));
162+
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(4, "UpdatedAt"));
163+
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(5, "StringEnumValue"));
164+
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(6, "NumericEnumValue"));
165+
166+
var dataTable = new DataTable();
167+
dataTable.Columns.Add("Name", typeof(string));
168+
dataTable.Columns.Add("Price", typeof(decimal));
169+
dataTable.Columns.Add("Identifier", typeof(Guid));
170+
dataTable.Columns.Add("CreatedAt", typeof(DateTime));
171+
dataTable.Columns.Add("UpdatedAt", typeof(DateTimeOffset));
172+
dataTable.Columns.Add("StringEnumValue", typeof(string));
173+
dataTable.Columns.Add("NumericEnumValue", typeof(int));
174+
175+
foreach (var entity in data)
176+
{
177+
var row = dataTable.NewRow();
178+
row["Name"] = entity.Name;
179+
row["Price"] = entity.Price;
180+
row["Identifier"] = entity.Identifier;
181+
row["CreatedAt"] = entity.CreatedAt;
182+
row["UpdatedAt"] = entity.UpdatedAt;
183+
row["StringEnumValue"] = entity.StringEnumValue.ToString();
184+
row["NumericEnumValue"] = (int)entity.NumericEnumValue;
185+
dataTable.Rows.Add(row);
186+
187+
if (dataTable.Rows.Count >= 50_000)
188+
{
189+
bulkCopy.WriteToServer(dataTable);
190+
dataTable.Clear();
191+
}
192+
}
193+
194+
if (dataTable.Rows.Count > 0)
195+
{
196+
bulkCopy.WriteToServer(dataTable);
197+
}
141198
}
142199
}

tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/LibComparatorMySql.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using BenchmarkDotNet.Attributes;
2+
using BenchmarkDotNet.Engines;
3+
14
using DotNet.Testcontainers.Containers;
25

36
using Microsoft.EntityFrameworkCore;
@@ -8,6 +11,9 @@
811

912
namespace PhenX.EntityFrameworkCore.BulkInsert.Benchmark;
1013

14+
[MinColumn, MaxColumn, BaselineColumn]
15+
[MemoryDiagnoser]
16+
[SimpleJob(RunStrategy.Throughput, launchCount: 1, warmupCount: 0, iterationCount: 5)]
1117
public class LibComparatorMySql : LibComparator
1218
{
1319
protected override void ConfigureDbContext()

tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/LibComparatorPostgreSql.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using BenchmarkDotNet.Attributes;
2+
using BenchmarkDotNet.Engines;
3+
14
using DotNet.Testcontainers.Containers;
25

36
using LinqToDB.EntityFrameworkCore;
@@ -10,6 +13,8 @@
1013

1114
namespace PhenX.EntityFrameworkCore.BulkInsert.Benchmark;
1215

16+
[MemoryDiagnoser]
17+
[SimpleJob(RunStrategy.Throughput, launchCount: 1, warmupCount: 0, iterationCount: 5)]
1318
public class LibComparatorPostgreSql : LibComparator
1419
{
1520
protected override void ConfigureDbContext()

tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/LibComparatorSqlServer.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using BenchmarkDotNet.Attributes;
2+
using BenchmarkDotNet.Engines;
3+
14
using DotNet.Testcontainers.Containers;
25

36
using LinqToDB.EntityFrameworkCore;
@@ -10,6 +13,9 @@
1013

1114
namespace PhenX.EntityFrameworkCore.BulkInsert.Benchmark;
1215

16+
[MinColumn, MaxColumn, BaselineColumn]
17+
[MemoryDiagnoser]
18+
[SimpleJob(RunStrategy.Throughput, launchCount: 1, warmupCount: 0, iterationCount: 5)]
1319
public class LibComparatorSqlServer : LibComparator
1420
{
1521
protected override void ConfigureDbContext()

tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/LibComparatorSqlite.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using BenchmarkDotNet.Attributes;
2+
using BenchmarkDotNet.Engines;
3+
14
using DotNet.Testcontainers.Containers;
25

36
using LinqToDB.EntityFrameworkCore;
@@ -8,6 +11,9 @@
811

912
namespace PhenX.EntityFrameworkCore.BulkInsert.Benchmark;
1013

14+
[MinColumn, MaxColumn, BaselineColumn]
15+
[MemoryDiagnoser]
16+
[SimpleJob(RunStrategy.Throughput, launchCount: 1, warmupCount: 0, iterationCount: 5)]
1117
public class LibComparatorSqlite : LibComparator
1218
{
1319
protected override void ConfigureDbContext()

tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/TestEntity.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ public class TestEntity
1818

1919
[Column(nameof(StringEnumValue), TypeName = "text")]
2020
public StringEnum StringEnumValue { get; set; }
21+
22+
public NumericEnum NumericEnumValue { get; set; }
23+
}
24+
25+
public enum NumericEnum
26+
{
27+
First = 1,
28+
Second = 2,
2129
}
2230

2331
public enum StringEnum

0 commit comments

Comments
 (0)