public async Task SaveAsync(IDatabase db, IContainerTracker <T> tracker,
                                    ITrackableContainer <T> container, RedisKey key)
        {
            if (tracker.HasChange == false)
            {
                return;
            }

            var updates = new List <HashEntry>();
            var removes = new List <RedisValue>();

            foreach (var item in _items)
            {
                var propertyTracker = (ITracker)item.TrackerPropertyInfo.GetValue(tracker);
                if (propertyTracker.HasChange)
                {
                    var propertyValue = item.ConvertToRedisValue(item.PropertyInfo.GetValue(container));
                    if (propertyValue.IsNull)
                    {
                        removes.Add(item.FieldName);
                    }
                    else
                    {
                        updates.Add(new HashEntry(item.FieldName, propertyValue));
                    }
                }
            }

            if (updates.Any())
            {
                await db.HashSetAsync(key, updates.ToArray());
            }
            if (removes.Any())
            {
                await db.HashDeleteAsync(key, removes.ToArray());
            }
        }
 public Task SaveAsync(IDatabase db, ITrackableContainer <T> container, RedisKey key)
 {
     return(SaveAsync(db, container.Tracker, container, key));
 }