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