Beispiel #1
0
        private DbCommand GenerateUpdateCommand(object entity, IEnumerable <string> fieldsToUpdate)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (fieldsToUpdate == null)
            {
                throw new ArgumentNullException(nameof(fieldsToUpdate));
            }

            Type           entityType     = entity.GetType();
            EntityMetadata entityMetadata = entityType.GetEntityMetadata();
            string         baseTable      = entityMetadata.BaseTableName;

            if (string.IsNullOrEmpty(baseTable))
            {
                throw new InvalidOperationException("cannot generate update command for entity " + entityType.Name + " because it does not have a base table");
            }
            if (entityMetadata.PrimaryKeyPropertyNames.Count == 0)
            {
                throw new InvalidOperationException("cannot generate update command for entity " + entityType.Name + " because it does not have a primary key");
            }

            string fullTableName = entityMetadata.GetFullTableName(this.DataService.EntityLiteProvider.DefaultSchema, this.DataService.EntityLiteProvider.StartQuote, this.DataService.EntityLiteProvider.EndQuote);

            IPropertyGetterDictionary getters = PropertyHelper.GetPropertyGetters(entityType);
            DbCommand     cmd         = DataService.EntityLiteProvider.CreateCommand();
            StringBuilder commandText = new StringBuilder();

            commandText.Append("\nUPDATE ").Append(fullTableName);

            bool hasEntityRowVersionField = false;

            GenerateUpdateSetClause(entity, fieldsToUpdate, entityMetadata, getters, cmd, commandText, ref hasEntityRowVersionField);
            GenerateUpdateWhereClauseWithPrimaryKeyAndEntityRowVersion(entity, entityMetadata, getters, cmd, commandText, hasEntityRowVersionField);
            if (this.DataService.IsPreventingSuperfluousUpdatesEnabled)
            {
                AddModifiedFieldsPredicateToToUpdateWhereClause(fieldsToUpdate, entityMetadata, commandText);
            }
            cmd.CommandText = commandText.ToString();
            return(cmd);
        }
Beispiel #2
0
        private DbCommand GenerateDeleteCommand(object entity)
        {
            try
            {
                if (entity == null)
                {
                    throw new ArgumentNullException(nameof(entity));
                }
                Type           entityType     = entity.GetType();
                EntityMetadata entityMetadata = entityType.GetEntityMetadata();
                if (entityMetadata == null)
                {
                    throw new InvalidOperationException("cannot generate delete command for entity " + entityType.Name + " because it does not have metadata");
                }
                string baseTable = entityMetadata.BaseTableName;
                if (string.IsNullOrEmpty(baseTable))
                {
                    throw new InvalidOperationException("cannot generate delete command for entity " + entityType.Name + " because it does not have a base table");
                }
                if (entityMetadata.PrimaryKeyPropertyNames.Count == 0)
                {
                    throw new InvalidOperationException("cannot generate delete command for entity " + entityType.Name + " because it does not have a primary key");
                }
                IPropertyGetterDictionary getters = PropertyHelper.GetPropertyGetters(entityType);
                DbCommand     cmd           = DataService.EntityLiteProvider.CreateCommand();
                StringBuilder commandText   = new StringBuilder();
                string        fullTableName = entityMetadata.GetFullTableName(this.DataService.EntityLiteProvider.DefaultSchema, this.DataService.EntityLiteProvider.StartQuote, this.DataService.EntityLiteProvider.EndQuote);
                commandText.Append("\nDELETE FROM ").Append(fullTableName);
                bool firstTime = true;
                foreach (string fieldName in entityMetadata.PrimaryKeyPropertyNames)
                {
                    var property            = entityMetadata.Properties[fieldName];
                    SqlFieldAttribute field = property.SqlField;
                    string            parameterName;
                    IDbDataParameter  param = CreateParameter(property, fieldName, out parameterName);
                    SetValueToCommandParameter(entity, getters, fieldName, param);
                    cmd.Parameters.Add(param);
                    if (firstTime)
                    {
                        commandText.Append("\nWHERE\n    ");
                        firstTime = false;
                    }
                    else
                    {
                        commandText.Append("\n    AND ");
                    }
                    commandText.Append(this.DataService.EntityLiteProvider.StartQuote + field.BaseColumnName + this.DataService.EntityLiteProvider.EndQuote).Append(" = ").Append(parameterName);
                }
                cmd.CommandText = commandText.ToString();
                return(cmd);
            }
            catch (Exception ex)
            {
                if (entity == null)
                {
                    Log?.LogError(ex, "Error generating delete command");
                }
                else
                {
                    string primaryKey = entity.GetPrimaryKey().ToListString() ?? "'no id'";
                    string message    = string.Format(CultureInfo.InvariantCulture, "Error generating delete command for entity of type {0} with primary key: {1}", entity.GetType().Name, primaryKey);
#pragma warning disable CA2254 // Template should be a static expression
                    Log?.LogError(ex, message);
#pragma warning restore CA2254 // Template should be a static expression
                }
                throw;
            }
        }