Пример #1
0
        /// <inheritdoc />
        protected override IDbStatement <TDbParameter> GetUpdateDbStatement(IPatchRequest <TId, T> request)
        {
            var parameters = new List <TDbParameter>();

            var typeAccessor = TypeAccessor.Create(typeof(T));
            var members      = typeAccessor.GetMembers();

            var assignments = string.Empty;

            foreach (var member in members.Where(m => request.Delta.ModifiedProperties.ContainsKey(m.Name)))
            {
                if (!Descriptor.CanWrite(member.Name))
                {
                    throw new InvalidOperationException($"Cannot write to '{member.Name}'");
                }

                var column = Descriptor.GetMappedColumnName(member.Name);
                if (string.IsNullOrWhiteSpace(column))
                {
                    continue;
                }

                var paramName = $"@{column}";
                assignments += $"{MakeColumnNameSafe(column)} = {paramName},";

                var paramValue = Descriptor.ProjectPropertyValue(request.Delta.ModifiedProperties[member.Name], member.Name) ??
                                 DBNull.Value;

                parameters.Add(GetDbParameter(paramName, paramValue));
            }

            assignments = assignments.TrimEnd(',');
            var sql = $"UPDATE {Descriptor.FullTableName} SET {assignments} WHERE {Descriptor.PrimaryKey} = @Id";

            parameters.Add(GetDbParameter("@Id", request.Delta.Identity));

            return(new DbStatement <TDbParameter>(sql, CommandType.Text, parameters.ToArray()));
        }
Пример #2
0
 /// <summary>
 /// Construct a new PatchBasket
 /// </summary>
 /// <param name="request">The patch request</param>
 /// <param name="parent">The basket which is the parent of the current one</param>
 public PatchBasket(IPatchRequest <TId, T> request, IBasket parent) : base(request, parent)
 {
 }
Пример #3
0
 /// <summary>
 /// Construct a new PatchBasket
 /// </summary>
 /// <param name="request">The patch request</param>
 public PatchBasket(IPatchRequest <TId, T> request) : base(request)
 {
 }
Пример #4
0
 /// <summary>
 /// Get a statement to perform a partial update of a record
 /// </summary>
 /// <param name="request">The partial update request</param>
 /// <returns>A statement to represent the "update" operation</returns>
 protected abstract IDbStatement <TDbParameter> GetUpdateDbStatement(IPatchRequest <TId, T> request);