// This method only make changes on db context - not on db. // If ht mappings will be not large, may be this method will be used from mapping worker private async Task AddOrUpdateMappings(int sourceHtId, int htIdToMap) { var utcDate = DateTimeOffset.UtcNow; var dbSourceAccommodationMapping = new HtAccommodationMapping { HtId = sourceHtId, MappedHtIds = new HashSet <int>() { htIdToMap }, Modified = utcDate, IsActive = true }; var htAccommodationMappingToDeactivate = await _context.HtAccommodationMappings.Where(hm => hm.HtId == htIdToMap && hm.IsActive).SingleOrDefaultAsync(); if (htAccommodationMappingToDeactivate != default) { dbSourceAccommodationMapping.MappedHtIds.UnionWith(htAccommodationMappingToDeactivate.MappedHtIds); htAccommodationMappingToDeactivate.IsActive = false; htAccommodationMappingToDeactivate.Modified = utcDate; _context.Update(htAccommodationMappingToDeactivate); } var htAccommodationMapping = await _context.HtAccommodationMappings.Where(hm => hm.HtId == sourceHtId).SingleOrDefaultAsync(); if (htAccommodationMapping != default) { htAccommodationMapping.MappedHtIds.UnionWith(dbSourceAccommodationMapping.MappedHtIds); htAccommodationMapping.Modified = utcDate; _context.Update(htAccommodationMapping); _mappingsCache.AddOrReset(sourceHtId, htAccommodationMapping.MappedHtIds); return; } dbSourceAccommodationMapping.Created = utcDate; _context.Add(dbSourceAccommodationMapping); _mappingsCache.AddOrReset(sourceHtId, dbSourceAccommodationMapping.MappedHtIds); }
private void AddOrUpdateHtAccommodationMappings(int deactivatedHtId, int actualHtId) { var dbHtAccommodationMapping = new HtAccommodationMapping { HtId = actualHtId, MappedHtIds = new HashSet <int>() { deactivatedHtId }, Modified = DateTimeOffset.UtcNow, IsActive = true }; if (_htAccommodationMappings.TryGetValue(deactivatedHtId, out var mappingsOfDeactivated)) { dbHtAccommodationMapping.MappedHtIds.UnionWith(mappingsOfDeactivated.MappedHtIds); // This done because ht mappings could be changed from different places before changes in db var entry = _context.ChangeTracker.Entries <HtAccommodationMapping>() .SingleOrDefault(hm => hm.Entity.Id == mappingsOfDeactivated.Id); if (entry != default) { entry.Entity.IsActive = false; entry.Entity.Modified = DateTimeOffset.UtcNow; entry.Property(e => e.IsActive).IsModified = true; entry.Property(e => e.Modified).IsModified = true; } else { var htAccommodationMappingToDeactivate = new HtAccommodationMapping { Id = mappingsOfDeactivated.Id, IsActive = false, Modified = DateTimeOffset.UtcNow }; _context.Attach(htAccommodationMappingToDeactivate); _context.Entry(htAccommodationMappingToDeactivate).Property(m => m.IsActive).IsModified = true; _context.Entry(htAccommodationMappingToDeactivate).Property(m => m.Modified).IsModified = true; } // This done because ht mappings could be changed from different places before changes in db _htAccommodationMappings.Remove(mappingsOfDeactivated.Id); } if (_htAccommodationMappings.TryGetValue(actualHtId, out var mappings)) { dbHtAccommodationMapping.MappedHtIds.UnionWith(mappings.MappedHtIds); // This done because ht mappings could be changed from different places before changes in db var entry = _context.ChangeTracker.Entries <HtAccommodationMapping>() .SingleOrDefault(hm => hm.Entity.Id == mappings.Id); if (entry != default) { entry.Entity.MappedHtIds = dbHtAccommodationMapping.MappedHtIds; entry.Entity.Modified = DateTimeOffset.UtcNow; entry.Property(e => e.MappedHtIds).IsModified = true; entry.Property(e => e.Modified).IsModified = true; } else { dbHtAccommodationMapping.Id = mappings.Id; _context.Attach(dbHtAccommodationMapping); _context.Entry(dbHtAccommodationMapping).Property(m => m.MappedHtIds).IsModified = true; _context.Entry(dbHtAccommodationMapping).Property(m => m.Modified).IsModified = true; } // This done because ht mappings could be changed from different places before changes in db _htAccommodationMappings[actualHtId] = new(mappings.Id, dbHtAccommodationMapping.MappedHtIds); return; } dbHtAccommodationMapping.Created = DateTimeOffset.UtcNow; _htAccommodationMappingsToAdd.Add(dbHtAccommodationMapping); }