From 973f1afb1b81481dc965445cc2f21c18945ae0cb Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov <ea.ivanov@digitaldrilling.ru> Date: Mon, 6 Feb 2023 21:33:53 +0500 Subject: [PATCH] refact ef update --- AsbCloudDb/Model/IAsbCloudDbContext.cs | 3 +++ .../Repository/UserRepository.cs | 22 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 4eac95f9..debd4de6 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -1,8 +1,10 @@ using AsbCloudDb.Model.Subsystems; using AsbCloudDb.Model.WITS; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Infrastructure; using System; +using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; @@ -70,6 +72,7 @@ namespace AsbCloudDb.Model Task<int> SaveChangesAsync(CancellationToken cancellationToken); DbSet<TEntity> Set<TEntity>(string name) where TEntity : class; DbSet<TEntity> Set<TEntity>() where TEntity : class; + EntityEntry<TEntity> Entry<TEntity>([NotNull] TEntity entity) where TEntity : class; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 0b5a3a58..9363409e 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -103,16 +103,24 @@ namespace AsbCloudInfrastructure.Repository var userRoles = await userRoleRepository.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false); await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); - var userInDb = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); - if (userInDb is not null) - { - userInDb = Convert(dto); - await dbContext.SaveChangesAsync(token); - } + + var entity = Convert(dto); + + var local = dbContext.Set<User>() + .Local + .FirstOrDefault(entry => entry.Id.Equals(entity.Id)); + if (local != null) + { + dbContext.Entry(local).State = EntityState.Detached; + } + dbContext.Entry(entity).State = EntityState.Modified; + await dbContext.SaveChangesAsync(token); DropCacheUsers(); - return userInDb!.Id; + return entity.Id; } + + public async Task<int> DeleteAsync(int id, CancellationToken token) { var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id);