public void RemoveDeviceEntity(string deviceId)
        {
            DeviceTwinFlatModel deviceEntity = null;
            bool result = DevicesDB.Devices.TryGetValue(deviceId, out deviceEntity);

            if (!result)
            {
                return;
            }

            result = DevicesDB.Devices.TryRemove(deviceId, out deviceEntity);
            if (!result)
            {
                Log.Error(string.Format("Error removing device {0} from the cache", deviceId));
            }
        }
        public void EnsureDeviceEntity(string deviceId, DeviceTwinTagsModel tags)
        {
            //Update cache
            DeviceTwinFlatModel deviceEntity = null;
            bool result = DevicesDB.Devices.TryGetValue(deviceId, out deviceEntity);

            if (!result)
            {
                deviceEntity = DevicesDB.Devices.GetOrAdd(deviceId, new DeviceTwinFlatModel());
            }

            deviceEntity.ProductFamily  = tags.ProductFamily;
            deviceEntity.ProductName    = tags.ProductName;
            deviceEntity.RetailerName   = tags.RetailerName;
            deviceEntity.RetailerRegion = tags.RetailerRegion;
        }
        private async Task RefreshDevicesTwinLocation(List <DeviceTwinFlatModel> devices)
        {
            try
            {
                DevicesDBCache deviceDB = _Cache.DevicesDB;
                if (!deviceDB.IsDevicesDBCacheInitialized || deviceDB.IsDevicesDBCacheLocationUpdating)
                {
                    return;
                }

                //Set updating to true
                deviceDB.IsDevicesDBCacheLocationUpdating = true;

                //Get devices
                ConcurrentDictionary <string, DeviceTwinFlatModel> deviceEntities = deviceDB.Devices;

                foreach (DeviceTwinFlatModel device in devices)
                {
                    LocationAddress location = GetLocationByIPAddress(device.IpAddress);

                    if (deviceEntities.ContainsKey(device.DeviceId))
                    {
                        DeviceTwinFlatModel twin = deviceEntities[device.DeviceId];
                        twin.Location = location;
                        dynamic locationPatch = new ExpandoObject();
                        locationPatch.location = location;
                        await _DeviceTwinRepo.UpdateDeviceSync(device.DeviceId, null, JsonConvert.SerializeObject(locationPatch));
                    }
                }

                //Set updating to false
                deviceDB.IsDevicesDBCacheLocationUpdating = false;
            }
            catch (Exception e)
            {
                Log.Error("Get IoTHub Devices Twin error {@error}", e.Message);
                throw e;
            }
        }