コード例 #1
0
        // 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);
        }
コード例 #2
0
    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);
    }