Skip to content

Commit 2cd3846

Browse files
committed
Value Conversions
1 parent fad061d commit 2cd3846

File tree

21 files changed

+413
-145
lines changed

21 files changed

+413
-145
lines changed

src/EntityFrameworkCore.SqlServer.SimpleBulks.Tests/Database/CompositeKeyRow.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ public class CompositeKeyRow<TId1, TId2>
1313
public DateTime Column3 { get; set; }
1414

1515
public Season? Season { get; set; }
16+
17+
public Season? SeasonAsString { get; set; }
1618
}

src/EntityFrameworkCore.SqlServer.SimpleBulks.Tests/Database/SingleKeyRow.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ public class SingleKeyRow<TId>
1111
public DateTime Column3 { get; set; }
1212

1313
public Season? Season { get; set; }
14+
15+
public Season? SeasonAsString { get; set; }
1416
}

src/EntityFrameworkCore.SqlServer.SimpleBulks.Tests/Database/TestDbContext.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
3636
modelBuilder.HasDefaultSchema(_schema);
3737
}
3838

39+
modelBuilder.Entity<SingleKeyRow<int>>().Property(x => x.SeasonAsString).HasConversion(v => v.ToString(), v => (Season)Enum.Parse(typeof(Season), v));
40+
3941
modelBuilder.Entity<CompositeKeyRow<int, int>>().HasKey(x => new { x.Id1, x.Id2 });
42+
modelBuilder.Entity<CompositeKeyRow<int, int>>().Property(x => x.SeasonAsString).HasConversion(v => v.ToString(), v => (Season)Enum.Parse(typeof(Season), v));
4043

4144
modelBuilder.Entity<ConfigurationEntry>().Property(x => x.Id).HasDefaultValueSql("newsequentialid()");
4245
modelBuilder.Entity<ConfigurationEntry>().Property(x => x.Id).HasColumnName("Id1");

src/EntityFrameworkCore.SqlServer.SimpleBulks.Tests/DbContextAsyncExtensions/BulkDeleteTests.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ public BulkDeleteTests(ITestOutputHelper output, SqlServerFixture fixture) : bas
2222
{
2323
Column1 = i,
2424
Column2 = "" + i,
25-
Column3 = DateTime.Now
25+
Column3 = DateTime.Now,
26+
Season = Season.Winter,
27+
SeasonAsString = Season.Winter
2628
});
2729

2830
compositeKeyRows.Add(new CompositeKeyRow<int, int>
@@ -31,15 +33,17 @@ public BulkDeleteTests(ITestOutputHelper output, SqlServerFixture fixture) : bas
3133
Id2 = i,
3234
Column1 = i,
3335
Column2 = "" + i,
34-
Column3 = DateTime.Now
36+
Column3 = DateTime.Now,
37+
Season = Season.Winter,
38+
SeasonAsString = Season.Winter
3539
});
3640
}
3741

3842
_context.BulkInsert(rows,
39-
row => new { row.Column1, row.Column2, row.Column3 });
43+
row => new { row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString });
4044

4145
_context.BulkInsert(compositeKeyRows,
42-
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 });
46+
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString });
4347

4448
tran.Commit();
4549
}

src/EntityFrameworkCore.SqlServer.SimpleBulks.Tests/DbContextAsyncExtensions/BulkInsertTests.cs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public async Task Bulk_Insert_Using_Linq_Without_Transaction(int length)
2727
Column1 = i,
2828
Column2 = "" + i,
2929
Column3 = DateTime.Now,
30-
Season = Season.Autumn
30+
Season = Season.Autumn,
31+
SeasonAsString = Season.Autumn
3132
});
3233

3334
compositeKeyRows.Add(new CompositeKeyRow<int, int>
@@ -37,19 +38,20 @@ public async Task Bulk_Insert_Using_Linq_Without_Transaction(int length)
3738
Column1 = i,
3839
Column2 = "" + i,
3940
Column3 = DateTime.Now,
40-
Season = Season.Autumn
41+
Season = Season.Autumn,
42+
SeasonAsString = Season.Autumn
4143
});
4244
}
4345

4446
await _context.BulkInsertAsync(rows,
45-
row => new { row.Column1, row.Column2, row.Column3, row.Season },
47+
row => new { row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString },
4648
options =>
4749
{
4850
options.LogTo = _output.WriteLine;
4951
});
5052

5153
await _context.BulkInsertAsync(compositeKeyRows,
52-
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3, row.Season },
54+
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString },
5355
options =>
5456
{
5557
options.LogTo = _output.WriteLine;
@@ -67,13 +69,15 @@ await _context.BulkInsertAsync(compositeKeyRows,
6769
Assert.Equal(rows[i].Column2, dbRows[i].Column2);
6870
Assert.Equal(rows[i].Column3, dbRows[i].Column3);
6971
Assert.Equal(rows[i].Season, dbRows[i].Season);
72+
Assert.Equal(rows[i].SeasonAsString, dbRows[i].SeasonAsString);
7073

7174
Assert.Equal(compositeKeyRows[i].Id1, dbCompositeKeyRows[i].Id1);
7275
Assert.Equal(compositeKeyRows[i].Id2, dbCompositeKeyRows[i].Id2);
7376
Assert.Equal(compositeKeyRows[i].Column1, dbCompositeKeyRows[i].Column1);
7477
Assert.Equal(compositeKeyRows[i].Column2, dbCompositeKeyRows[i].Column2);
7578
Assert.Equal(compositeKeyRows[i].Column3, dbCompositeKeyRows[i].Column3);
7679
Assert.Equal(compositeKeyRows[i].Season, dbCompositeKeyRows[i].Season);
80+
Assert.Equal(compositeKeyRows[i].SeasonAsString, dbCompositeKeyRows[i].SeasonAsString);
7781
}
7882
}
7983

@@ -93,7 +97,9 @@ public async Task Bulk_Insert_Using_Linq_With_Transaction_Committed(int length)
9397
{
9498
Column1 = i,
9599
Column2 = "" + i,
96-
Column3 = DateTime.Now
100+
Column3 = DateTime.Now,
101+
Season = Season.Spring,
102+
SeasonAsString = Season.Spring
97103
});
98104

99105
compositeKeyRows.Add(new CompositeKeyRow<int, int>
@@ -102,15 +108,17 @@ public async Task Bulk_Insert_Using_Linq_With_Transaction_Committed(int length)
102108
Id2 = i,
103109
Column1 = i,
104110
Column2 = "" + i,
105-
Column3 = DateTime.Now
111+
Column3 = DateTime.Now,
112+
Season = Season.Spring,
113+
SeasonAsString = Season.Spring
106114
});
107115
}
108116

109117
await _context.BulkInsertAsync(rows,
110-
row => new { row.Column1, row.Column2, row.Column3 });
118+
row => new { row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString });
111119

112120
await _context.BulkInsertAsync(compositeKeyRows,
113-
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 });
121+
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString });
114122

115123
tran.Commit();
116124

@@ -124,12 +132,16 @@ await _context.BulkInsertAsync(compositeKeyRows,
124132
Assert.Equal(rows[i].Column1, dbRows[i].Column1);
125133
Assert.Equal(rows[i].Column2, dbRows[i].Column2);
126134
Assert.Equal(rows[i].Column3, dbRows[i].Column3);
135+
Assert.Equal(rows[i].Season, dbRows[i].Season);
136+
Assert.Equal(rows[i].SeasonAsString, dbRows[i].SeasonAsString);
127137

128138
Assert.Equal(compositeKeyRows[i].Id1, dbCompositeKeyRows[i].Id1);
129139
Assert.Equal(compositeKeyRows[i].Id2, dbCompositeKeyRows[i].Id2);
130140
Assert.Equal(compositeKeyRows[i].Column1, dbCompositeKeyRows[i].Column1);
131141
Assert.Equal(compositeKeyRows[i].Column2, dbCompositeKeyRows[i].Column2);
132142
Assert.Equal(compositeKeyRows[i].Column3, dbCompositeKeyRows[i].Column3);
143+
Assert.Equal(compositeKeyRows[i].Season, dbCompositeKeyRows[i].Season);
144+
Assert.Equal(compositeKeyRows[i].SeasonAsString, dbCompositeKeyRows[i].SeasonAsString);
133145
}
134146
}
135147

@@ -149,7 +161,9 @@ public async Task Bulk_Insert_Using_Linq_With_Transaction_RolledBack(int length)
149161
{
150162
Column1 = i,
151163
Column2 = "" + i,
152-
Column3 = DateTime.Now
164+
Column3 = DateTime.Now,
165+
Season = Season.Summer,
166+
SeasonAsString = Season.Summer
153167
});
154168

155169
compositeKeyRows.Add(new CompositeKeyRow<int, int>
@@ -158,15 +172,17 @@ public async Task Bulk_Insert_Using_Linq_With_Transaction_RolledBack(int length)
158172
Id2 = i,
159173
Column1 = i,
160174
Column2 = "" + i,
161-
Column3 = DateTime.Now
175+
Column3 = DateTime.Now,
176+
Season = Season.Summer,
177+
SeasonAsString = Season.Summer
162178
});
163179
}
164180

165181
await _context.BulkInsertAsync(rows,
166-
row => new { row.Column1, row.Column2, row.Column3 });
182+
row => new { row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString });
167183

168184
await _context.BulkInsertAsync(compositeKeyRows,
169-
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 });
185+
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString });
170186

171187
tran.Rollback();
172188

src/EntityFrameworkCore.SqlServer.SimpleBulks.Tests/DbContextAsyncExtensions/BulkMergeTests.cs

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ private async Task SeedData(int length)
2626
{
2727
Column1 = i,
2828
Column2 = "" + i,
29-
Column3 = DateTime.Now
29+
Column3 = DateTime.Now,
30+
Season = Season.Winter,
31+
SeasonAsString = Season.Winter
3032
});
3133

3234
compositeKeyRows.Add(new CompositeKeyRow<int, int>
@@ -35,15 +37,17 @@ private async Task SeedData(int length)
3537
Id2 = i,
3638
Column1 = i,
3739
Column2 = "" + i,
38-
Column3 = DateTime.Now
40+
Column3 = DateTime.Now,
41+
Season = Season.Winter,
42+
SeasonAsString = Season.Winter
3943
});
4044
}
4145

4246
await _context.BulkInsertAsync(rows,
43-
row => new { row.Column1, row.Column2, row.Column3 });
47+
row => new { row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString });
4448

4549
await _context.BulkInsertAsync(compositeKeyRows,
46-
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 });
50+
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString });
4751

4852
tran.Commit();
4953
}
@@ -64,19 +68,25 @@ public async Task BulkMerge_Using_Linq_With_Transaction(int length)
6468
{
6569
row.Column2 = "abc";
6670
row.Column3 = DateTime.Now;
71+
row.Season = Season.Spring;
72+
row.SeasonAsString = Season.Spring;
6773
}
6874

6975
foreach (var row in compositeKeyRows)
7076
{
7177
row.Column2 = "abc";
7278
row.Column3 = DateTime.Now;
79+
row.Season = Season.Spring;
80+
row.SeasonAsString = Season.Spring;
7381
}
7482

7583
rows.Add(new SingleKeyRow<int>
7684
{
7785
Column1 = length,
7886
Column2 = "Inserted using Merge" + length,
7987
Column3 = DateTime.Now,
88+
Season = Season.Summer,
89+
SeasonAsString = Season.Summer
8090
});
8191

8292
var newId1 = length;
@@ -89,12 +99,14 @@ public async Task BulkMerge_Using_Linq_With_Transaction(int length)
8999
Column1 = newId2,
90100
Column2 = "Inserted using Merge" + newId2,
91101
Column3 = DateTime.Now,
102+
Season = Season.Summer,
103+
SeasonAsString = Season.Summer
92104
});
93105

94106
await _context.BulkMergeAsync(rows,
95107
row => row.Id,
96-
row => new { row.Column1, row.Column2, row.Column3 },
97-
row => new { row.Column1, row.Column2, row.Column3 },
108+
row => new { row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString },
109+
row => new { row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString },
98110
options =>
99111
{
100112
options.LogTo = _output.WriteLine;
@@ -103,8 +115,8 @@ await _context.BulkMergeAsync(rows,
103115

104116
await _context.BulkMergeAsync(compositeKeyRows,
105117
row => new { row.Id1, row.Id2 },
106-
row => new { row.Column1, row.Column2, row.Column3 },
107-
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 },
118+
row => new { row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString },
119+
row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3, row.Season, row.SeasonAsString },
108120
options =>
109121
{
110122
options.LogTo = _output.WriteLine;
@@ -122,12 +134,16 @@ await _context.BulkMergeAsync(compositeKeyRows,
122134
Assert.Equal(rows[i].Column1, dbRows[i].Column1);
123135
Assert.Equal(rows[i].Column2, dbRows[i].Column2);
124136
Assert.Equal(rows[i].Column3, dbRows[i].Column3);
137+
Assert.Equal(rows[i].Season, dbRows[i].Season);
138+
Assert.Equal(rows[i].SeasonAsString, dbRows[i].SeasonAsString);
125139

126140
Assert.Equal(compositeKeyRows[i].Id1, dbCompositeKeyRows[i].Id1);
127141
Assert.Equal(compositeKeyRows[i].Id2, dbCompositeKeyRows[i].Id2);
128142
Assert.Equal(compositeKeyRows[i].Column1, dbCompositeKeyRows[i].Column1);
129143
Assert.Equal(compositeKeyRows[i].Column2, dbCompositeKeyRows[i].Column2);
130144
Assert.Equal(compositeKeyRows[i].Column3, dbCompositeKeyRows[i].Column3);
145+
Assert.Equal(compositeKeyRows[i].Season, dbCompositeKeyRows[i].Season);
146+
Assert.Equal(compositeKeyRows[i].SeasonAsString, dbCompositeKeyRows[i].SeasonAsString);
131147
}
132148
}
133149

@@ -147,19 +163,25 @@ public async Task BulkMerge_Using_Dynamic_String_With_Transaction(int length)
147163
{
148164
row.Column2 = "abc";
149165
row.Column3 = DateTime.Now;
166+
row.Season = Season.Autumn;
167+
row.SeasonAsString = Season.Autumn;
150168
}
151169

152170
foreach (var row in compositeKeyRows)
153171
{
154172
row.Column2 = "abc";
155173
row.Column3 = DateTime.Now;
174+
row.Season = Season.Autumn;
175+
row.SeasonAsString = Season.Autumn;
156176
}
157177

158178
rows.Add(new SingleKeyRow<int>
159179
{
160180
Column1 = length,
161181
Column2 = "Inserted using Merge" + length,
162182
Column3 = DateTime.Now,
183+
Season = Season.Summer,
184+
SeasonAsString = Season.Summer
163185
});
164186

165187
var newId1 = length;
@@ -172,21 +194,23 @@ public async Task BulkMerge_Using_Dynamic_String_With_Transaction(int length)
172194
Column1 = newId2,
173195
Column2 = "Inserted using Merge" + newId2,
174196
Column3 = DateTime.Now,
197+
Season = Season.Summer,
198+
SeasonAsString = Season.Summer
175199
});
176200

177201
await _context.BulkMergeAsync(rows,
178202
"Id",
179-
["Column1", "Column2", "Column3"],
180-
["Column1", "Column2", "Column3"],
203+
["Column1", "Column2", "Column3", "Season", "SeasonAsString"],
204+
["Column1", "Column2", "Column3", "Season", "SeasonAsString"],
181205
options =>
182206
{
183207
options.LogTo = _output.WriteLine;
184208
options.ReturnDbGeneratedId = true;
185209
});
186210
await _context.BulkMergeAsync(compositeKeyRows,
187211
["Id1", "Id2"],
188-
["Column1", "Column2", "Column3"],
189-
["Id1", "Id2", "Column1", "Column2", "Column3"],
212+
["Column1", "Column2", "Column3", "Season", "SeasonAsString"],
213+
["Id1", "Id2", "Column1", "Column2", "Column3", "Season", "SeasonAsString"],
190214
options =>
191215
{
192216
options.LogTo = _output.WriteLine;
@@ -204,12 +228,16 @@ await _context.BulkMergeAsync(compositeKeyRows,
204228
Assert.Equal(rows[i].Column1, dbRows[i].Column1);
205229
Assert.Equal(rows[i].Column2, dbRows[i].Column2);
206230
Assert.Equal(rows[i].Column3, dbRows[i].Column3);
231+
Assert.Equal(rows[i].Season, dbRows[i].Season);
232+
Assert.Equal(rows[i].SeasonAsString, dbRows[i].SeasonAsString);
207233

208234
Assert.Equal(compositeKeyRows[i].Id1, dbCompositeKeyRows[i].Id1);
209235
Assert.Equal(compositeKeyRows[i].Id2, dbCompositeKeyRows[i].Id2);
210236
Assert.Equal(compositeKeyRows[i].Column1, dbCompositeKeyRows[i].Column1);
211237
Assert.Equal(compositeKeyRows[i].Column2, dbCompositeKeyRows[i].Column2);
212238
Assert.Equal(compositeKeyRows[i].Column3, dbCompositeKeyRows[i].Column3);
239+
Assert.Equal(compositeKeyRows[i].Season, dbCompositeKeyRows[i].Season);
240+
Assert.Equal(compositeKeyRows[i].SeasonAsString, dbCompositeKeyRows[i].SeasonAsString);
213241
}
214242
}
215243

0 commit comments

Comments
 (0)