private IReadOnlyList <ColumnModification> GenerateColumnModifications()
        {
            var adding = EntityState == EntityState.Added;
            var columnModifications = new List <ColumnModification>();
            var srcType             = _values?.GetType();

            foreach (var property in _entry.EntityType.GetProperties())
            {
                var    propertyAnnotations = property.Relational();
                var    isKey = property.IsPrimaryKey();
                var    isConcurrencyToken = property.IsConcurrencyToken;
                var    isCondition        = !adding && (isKey || isConcurrencyToken);
                var    readValue          = _entry.IsStoreGenerated(property);
                var    writeValue         = false;
                object value = null;

                var srcProp = srcType?.GetProperty(property.Name);

                if (!readValue)
                {
                    var modified = false;

                    if (srcProp != null)
                    {
                        value = srcProp.GetValue(_values);
                        _entry.SetCurrentValue(property, value);
                        modified = true;
                    }

                    if (adding && property.BeforeSaveBehavior == PropertySaveBehavior.Save ||
                        property.AfterSaveBehavior == PropertySaveBehavior.Save && modified)
                    {
                        writeValue = true;
                    }
                }

                if (readValue || writeValue || isCondition)
                {
                    var columnModification = new ColumnModification(
                        _entry,
                        property,
                        propertyAnnotations,
                        () => GenerateParameterName(isCondition && isConcurrencyToken),
                        readValue && !_writeOnly,
                        writeValue,
                        isKey,
                        isCondition,
                        isConcurrencyToken);

                    columnModifications.Add(columnModification);
                }
            }

            return(columnModifications);
        }