Проблема в том, что если я решу этот способ :
Код: Выделить всё
public async Task Like(LikeDto dto)
{
async Task likeAndSave(Rating rating, bool isLiked)
{
bool like() => rating.Like(_auth.User, rating.OfferId, isLiked);
var liked = false;
try
{
liked = like();
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
_context.Entry(rating).Reload();
liked = like();
await _context.SaveChangesAsync();
//Concurrency conflic my occur again here.
}
return liked;
}
var rating = await _context.Set()
.Include(e => e.Likes.Where(e => e.User.Id == _auth.UserId))
.FirstOrDefaultAsync(e => e.OfferId == dto.Id);
var liked = await likeAndSave(rating, dto.Liked);
return rating.Analytics;
}
Код: Выделить всё
public async Task Like(LikeDto dto)
{
async Task likeAndSave(bool isLiked)
{
var liked = false;
var res = await Policies.DbUpdateConcurrencyRetryPolicy.ExecuteAsync(async () =>
{
var rating = await _context.Set()
.Include(e => e.Likes.Where(e => e.User.Id == _auth.UserId))
.FirstOrDefaultAsync(e => e.OfferId == dto.Id);
liked = rating.Like(_auth.User, rating.OfferId, isLiked);
await _context.SaveChangesAsync();
return (rating, liked);
});
return res;
}
var (rating, liked) = await likeAndSave(dto.Liked);
return rating.Analytics;
}
Код: Выделить всё
public static class Policies
{
public static readonly AsyncRetryPolicy DbUpdateConcurrencyRetryPolicy = Policy
.Handle()
.WaitAndRetryAsync(50, retryAttempt =>
TimeSpan.FromMilliseconds(TimeSpan.FromSeconds(2).TotalMilliseconds * Math.Pow(2, retryAttempt - 1)));
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... post-likes
Мобильная версия