Skip to content

Commit 19fe493

Browse files
committed
Explicit strategy
1 parent 65e713c commit 19fe493

File tree

1 file changed

+36
-22
lines changed

1 file changed

+36
-22
lines changed

src/LinkDotNet.Blog.Infrastructure/Persistence/Sql/Repository.cs

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,46 +110,60 @@ public async ValueTask DeleteAsync(string id)
110110
public async ValueTask DeleteBulkAsync(IEnumerable<string> ids)
111111
{
112112
var blogDbContext = await dbContextFactory.CreateDbContextAsync();
113-
await using var trx = await blogDbContext.Database.BeginTransactionAsync();
113+
var strategy = blogDbContext.Database.CreateExecutionStrategy();
114114

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

119-
for (var batch = 0; batch < totalBatches; batch++)
117+
async Task DeleteBulkAsyncInBatchesAsync()
120118
{
121-
var currentBatchIds = idList.Skip(batch * batchSize).Take(batchSize).ToList();
119+
await using var trx = await blogDbContext.Database.BeginTransactionAsync();
122120

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

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

130-
await trx.CommitAsync();
133+
LogDeleteBatch(batch + 1, (batch + 1) * batchSize);
134+
}
135+
136+
await trx.CommitAsync();
137+
}
131138
}
132139

133140
public async ValueTask StoreBulkAsync(IEnumerable<TEntity> records)
134141
{
135142
ArgumentNullException.ThrowIfNull(records);
136143

137144
var blogDbContext = await dbContextFactory.CreateDbContextAsync();
138-
await using var trx = await blogDbContext.Database.BeginTransactionAsync();
145+
var strategy = blogDbContext.Database.CreateExecutionStrategy();
139146

140-
var count = 0;
141-
foreach (var record in records)
147+
await strategy.ExecuteAsync(async () => await StoreBulkAsyncInBatchesAsync());
148+
149+
async Task StoreBulkAsyncInBatchesAsync()
142150
{
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)
145155
{
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+
}
148162
}
149-
}
150163

151-
await blogDbContext.SaveChangesAsync();
152-
await trx.CommitAsync();
164+
await blogDbContext.SaveChangesAsync();
165+
await trx.CommitAsync();
166+
}
153167
}
154168

155169
[LoggerMessage(LogLevel.Debug, "Saving Batch. In total {Count} elements saved")]

0 commit comments

Comments
 (0)