Skip to content

Commit ebb0847

Browse files
Concurrency
1 parent 5f96e95 commit ebb0847

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

.editorconfig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ csharp_preserve_single_line_blocks = true
125125
# IntelliTect Conventions #
126126
###############################
127127
# var preferences
128-
csharp_style_var_for_built_in_types = false:warning
128+
csharp_style_var_for_built_in_types = false:none
129129
csharp_style_var_when_type_is_apparent = true:suggestion
130-
csharp_style_var_elsewhere = false:warning
130+
csharp_style_var_elsewhere = false:none
131131

132132
## Naming
133133
# Style Definitions

EssentialCSharp.Web/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ private static void Main(string[] args)
2525
builder.Logging.AddConsole();
2626
builder.Services.AddHealthChecks();
2727

28-
builder.Services.AddDbContext<EssentialCSharpWebContext>(options => options.UseSqlServer(connectionString));
28+
builder.Services.AddDbContextFactory<EssentialCSharpWebContext>(options => options.UseSqlServer(connectionString));
2929
builder.Services.AddDefaultIdentity<EssentialCSharpWebUser>(options =>
3030
{
3131
// Password settings

EssentialCSharp.Web/Services/Referrals/ReferralService.cs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Security.Claims;
1+
using System.Security.Claims;
22
using EssentialCSharp.Web.Areas.Identity.Data;
33
using EssentialCSharp.Web.Data;
44
using Microsoft.AspNetCore.Identity;
@@ -70,9 +70,42 @@ static async Task TrackReferral(EssentialCSharpWebContext dbContext, string refe
7070
}
7171
else
7272
{
73-
dbUser.ReferralCount++;
74-
await dbContext.SaveChangesAsync();
75-
return;
73+
bool saved = false;
74+
while (!saved)
75+
{
76+
try
77+
{
78+
dbUser.ReferralCount++;
79+
await dbContext.SaveChangesAsync();
80+
saved = true;
81+
}
82+
catch (DbUpdateConcurrencyException ex)
83+
{
84+
foreach (var entry in ex.Entries)
85+
{
86+
if (entry.Entity is EssentialCSharpWebUser)
87+
{
88+
var proposedValues = entry.CurrentValues;
89+
var databaseValues = await entry.GetDatabaseValuesAsync();
90+
91+
if (databaseValues is not null)
92+
{
93+
var databaseReferralCount = (int?)databaseValues[nameof(EssentialCSharpWebUser.ReferralCount)];
94+
proposedValues[nameof(EssentialCSharpWebUser.ReferralCount)] = databaseReferralCount + 1;
95+
96+
// Refresh original values to bypass next concurrency check
97+
entry.OriginalValues.SetValues(databaseValues);
98+
}
99+
}
100+
else
101+
{
102+
throw new NotSupportedException(
103+
"Don't know how to handle concurrency conflicts for "
104+
+ entry.Metadata.Name);
105+
}
106+
}
107+
}
108+
}
76109
}
77110
}
78111
}

0 commit comments

Comments
 (0)