@@ -110,46 +110,60 @@ public async ValueTask DeleteAsync(string id)
110
110
public async ValueTask DeleteBulkAsync ( IEnumerable < string > ids )
111
111
{
112
112
var blogDbContext = await dbContextFactory . CreateDbContextAsync ( ) ;
113
- await using var trx = await blogDbContext . Database . BeginTransactionAsync ( ) ;
113
+ var strategy = blogDbContext . Database . CreateExecutionStrategy ( ) ;
114
114
115
- var idList = ids . ToList ( ) ;
116
- const int batchSize = 1000 ;
117
- var totalBatches = ( int ) Math . Ceiling ( ( double ) idList . Count / batchSize ) ;
115
+ await strategy . ExecuteAsync ( async ( ) => await DeleteBulkAsyncInBatchesAsync ( ) ) ;
118
116
119
- for ( var batch = 0 ; batch < totalBatches ; batch ++ )
117
+ async Task DeleteBulkAsyncInBatchesAsync ( )
120
118
{
121
- var currentBatchIds = idList . Skip ( batch * batchSize ) . Take ( batchSize ) . ToList ( ) ;
119
+ await using var trx = await blogDbContext . Database . BeginTransactionAsync ( ) ;
122
120
123
- await blogDbContext . Set < TEntity > ( )
124
- . Where ( s => currentBatchIds . Contains ( s . Id ) )
125
- . ExecuteDeleteAsync ( ) ;
121
+ var idList = ids . ToList ( ) ;
122
+ const int batchSize = 1000 ;
123
+ var totalBatches = ( int ) Math . Ceiling ( ( double ) idList . Count / batchSize ) ;
126
124
127
- LogDeleteBatch ( batch + 1 , ( batch + 1 ) * batchSize ) ;
128
- }
125
+ for ( var batch = 0 ; batch < totalBatches ; batch ++ )
126
+ {
127
+ var currentBatchIds = idList . Skip ( batch * batchSize ) . Take ( batchSize ) . ToList ( ) ;
128
+
129
+ await blogDbContext . Set < TEntity > ( )
130
+ . Where ( s => currentBatchIds . Contains ( s . Id ) )
131
+ . ExecuteDeleteAsync ( ) ;
129
132
130
- await trx . CommitAsync ( ) ;
133
+ LogDeleteBatch ( batch + 1 , ( batch + 1 ) * batchSize ) ;
134
+ }
135
+
136
+ await trx . CommitAsync ( ) ;
137
+ }
131
138
}
132
139
133
140
public async ValueTask StoreBulkAsync ( IEnumerable < TEntity > records )
134
141
{
135
142
ArgumentNullException . ThrowIfNull ( records ) ;
136
143
137
144
var blogDbContext = await dbContextFactory . CreateDbContextAsync ( ) ;
138
- await using var trx = await blogDbContext . Database . BeginTransactionAsync ( ) ;
145
+ var strategy = blogDbContext . Database . CreateExecutionStrategy ( ) ;
139
146
140
- var count = 0 ;
141
- foreach ( var record in records )
147
+ await strategy . ExecuteAsync ( async ( ) => await StoreBulkAsyncInBatchesAsync ( ) ) ;
148
+
149
+ async Task StoreBulkAsyncInBatchesAsync ( )
142
150
{
143
- await blogDbContext . Set < TEntity > ( ) . AddAsync ( record ) ;
144
- if ( ++ count % 1000 == 0 )
151
+ await using var trx = await blogDbContext . Database . BeginTransactionAsync ( ) ;
152
+
153
+ var count = 0 ;
154
+ foreach ( var record in records )
145
155
{
146
- LogBatch ( count ) ;
147
- await blogDbContext . SaveChangesAsync ( ) ;
156
+ await blogDbContext . Set < TEntity > ( ) . AddAsync ( record ) ;
157
+ if ( ++ count % 1000 == 0 )
158
+ {
159
+ LogBatch ( count ) ;
160
+ await blogDbContext . SaveChangesAsync ( ) ;
161
+ }
148
162
}
149
- }
150
163
151
- await blogDbContext . SaveChangesAsync ( ) ;
152
- await trx . CommitAsync ( ) ;
164
+ await blogDbContext . SaveChangesAsync ( ) ;
165
+ await trx . CommitAsync ( ) ;
166
+ }
153
167
}
154
168
155
169
[ LoggerMessage ( LogLevel . Debug , "Saving Batch. In total {Count} elements saved" ) ]
0 commit comments