Exemplo n.º 1
0
        public void AddOperation(UpdateOperation operation)
        {
            var name = TableName;

            if (null != name && operation.TableName != name)
            {
                throw new ArgumentException(string.Format(
                                                "Table name mismatch for UPDATE command. Expected: {0}. Actual: {1}.",
                                                name,
                                                operation.TableName),
                                            "operation");
            }

            var pk = PrimaryKeyAsObject;

            if (null != pk &&
                !PrimaryKeyComparer.SuppliedPrimaryKeyValuesMatch(
                    operation.OwnerMetadata,
                    pk,
                    operation.OwnerPrimaryKeyAsObject))//operation.OwnerPrimaryKey != pk.Value)
            {
                throw new ArgumentException(string.Format(
                                                "Primary key mismatch for UPDATE command on table {0}. Expected: {1}. Actual: {2}.",
                                                name,
                                                pk,
                                                operation.OwnerPrimaryKeyAsObject),
                                            "operation");
            }

            name = PrimaryKeyColumn;
            if (null != name && operation.OwnerPrimaryKeyColumn != name)
            {
                throw new ArgumentException(string.Format(
                                                "Primary key column mismatch for UPDATE command on table {0}. Expected: {1}. Actual: {2}.",
                                                TableName,
                                                name,
                                                operation.OwnerPrimaryKeyColumn),
                                            "operation");
            }

            TableName        = operation.TableName;
            PrimaryKeyColumn = operation.OwnerPrimaryKeyColumn;

            _operations.Add(operation);
        }
Exemplo n.º 2
0
        public IEnumerable <BaseCommand> Coalesce(IEnumerable <BaseOperation> operations)
        {
            var results = new List <BaseCommand>();
            var updates = new List <UpdateOperation>();

            var         updateColumns   = CreateUpdateColumnSet();
            DtoMetadata updateMetadata  = null;
            string      updateTableName = null;
            object      updatePk        = null;

            foreach (var operation in operations)
            {
                if (operation is UpdateOperation)
                {
                    var update             = operation as UpdateOperation;
                    var newMetadata        = GetNewUpdateMetadata(update);
                    var newTableName       = GetNewUpdateTableName(update);
                    var newPrimaryKeyValue = GetNewUpdatePrimaryKeyValue(update);
                    //  If the table name, or row PK changes, we need to apply any UpdateOperations we already have as a new command
                    //  then start tracking UpdateOperations afresh, starting with this one.
                    if (updateTableName != newTableName ||
                        updateMetadata != newMetadata ||
                        !PrimaryKeyComparer.SuppliedPrimaryKeyValuesMatch(
                            newMetadata,
                            updatePk,
                            newPrimaryKeyValue) ||
                        updateColumns.Contains(update.ColumnName))
                    {
                        ValidateUpdateOperation(update);
                        if (null != updateTableName)
                        {
                            ApplyUpdatesSoFarAsNewCommand(results, updates, ref updateTableName, ref updatePk);
                        }

                        updateColumns   = CreateUpdateColumnSet();
                        updateMetadata  = newMetadata;
                        updateTableName = newTableName;
                        updatePk        = newPrimaryKeyValue;
                    }

                    //  TODO: replace UPDATE on same column

                    updateColumns.Add(update.ColumnName);
                    updates.Add(update);
                }
                else
                {
                    ApplyUpdatesSoFarAsNewCommand(results, updates, ref updateTableName, ref updatePk);

                    updateColumns   = CreateUpdateColumnSet();
                    updateMetadata  = null;
                    updateTableName = null;
                    updatePk        = null;

                    ValidateInsertOrDeleteOperation((BaseInsertDeleteOperation)operation);

                    if (operation is InsertOperation)
                    {
                        results.Add(new InsertCommand(operation as InsertOperation));
                    }
                    else if (operation is DeleteOperation)
                    {
                        results.Add(new DeleteCommand(operation as DeleteOperation));
                    }
                }
            }

            if (updates.Count > 0)
            {
                ApplyUpdatesSoFarAsNewCommand(results, updates, ref updateTableName, ref updatePk);
            }

            return(results);
        }