示例#1
0
 public async Task SaveAsync(IDatabase db, IContainerTracker <T> tracker, RedisKey key)
 {
     foreach (var pi in _items)
     {
         await pi.SaveAsync(db, tracker, key);
     }
 }
示例#2
0
        public async Task SaveAsync(IMongoCollection <BsonDocument> collection,
                                    IContainerTracker <T> tracker,
                                    params object[] keyValues)
        {
            if (keyValues.Length == 0)
            {
                throw new ArgumentException("At least 1 keyValue required.");
            }

            var filter = Builders <BsonDocument> .Filter.Eq("_id", keyValues[0]);

            var partialKeys = keyValues.Skip(1).ToArray();

            UpdateDefinition <BsonDocument> update = null;

            foreach (var pi in _items)
            {
                var updates = pi.SaveChanges(update, tracker, partialKeys);
                if (updates != null)
                {
                    if (updates.Count > 1)
                    {
                        for (var i = 0; i < updates.Count - 1; i++)
                        {
                            await collection.UpdateOneAsync(filter, updates[i]);
                        }
                    }
                    update = updates.Last();
                }
            }
            if (update != null)
            {
                await collection.UpdateOneAsync(filter, update);
            }
        }
        public async Task <int> SaveAsync(DbConnection connection, IContainerTracker <T> tracker,
                                          params object[] keyValues)
        {
            var sql = BuildSqlForSave(tracker, keyValues);

            using (var command = _sqlProvider.CreateDbCommand(sql, connection))
            {
                return(await command.ExecuteNonQueryAsync());
            }
        }
        public string BuildSqlForSave(IContainerTracker <T> tracker, params object[] keyValues)
        {
            var sql = new StringBuilder();

            foreach (var pi in _items)
            {
                sql.Append(pi.BuildSqlForSave(tracker, keyValues));
            }
            return(sql.ToString());
        }
        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 IEnumerable <ITracker> GetTrackers(IContainerTracker <T> tracker)
 {
     return(_items.Select(item => (ITracker)item.TrackerPropertyInfo.GetValue(tracker)));
 }