/// <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())); }
/// <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) { }
/// <summary> /// Construct a new PatchBasket /// </summary> /// <param name="request">The patch request</param> public PatchBasket(IPatchRequest <TId, T> request) : base(request) { }
/// <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);