Exemplo n.º 1
0
        protected override void OnMutating(IDataMutateContext context, UpsertStatement statement)
        {
            //如果新增实体包含序号定义项则尝试处理其中的外部序号
            if (statement.Entity.HasSequences)
            {
                foreach (var field in statement.Fields)
                {
                    if (field.Token.Property.IsSimplex)
                    {
                        var sequence = ((IDataEntitySimplexProperty)field.Token.Property).Sequence;

                        if (sequence != null && sequence.IsExternal)
                        {
                            var value = field.Token.GetValue(context.Data);

                            if (value == null || Convert.IsDBNull(value) || object.Equals(value, Zongsoft.Common.TypeExtension.GetDefaultValue(field.Token.MemberType)))
                            {
                                field.Token.SetValue(context.Data, Convert.ChangeType(((DataAccess)context.DataAccess).Increase(context, sequence, context.Data), field.Token.MemberType));
                            }
                        }
                    }
                }
            }

            //调用基类同名方法
            base.OnMutating(context, statement);
        }
Exemplo n.º 2
0
        protected virtual bool OnExecute(IDataMutateContext context, TStatement statement)
        {
            if (context.Method != DataAccessMethod.Insert && context.Entity.Immutable)
            {
                throw new DataException($"The '{context.Entity.Name}' is an immutable entity and does not support {context.Method} operation.");
            }

            //根据生成的脚本创建对应的数据命令
            var command = context.Session.Build(statement);

            //获取当前操作是否为多数据
            var isMultiple = statement.Schema == null ?
                             context.IsMultiple :
                             statement.Schema.Token.IsMultiple;

            if (isMultiple)
            {
                var continued = false;

                foreach (var item in (IEnumerable)context.Data)
                {
                    //更新当前操作数据
                    context.Data = item;

                    continued |= this.Mutate(context, statement, command);
                }

                return(continued);
            }
            else
            {
                return(this.Mutate(context, statement, command));
            }
        }
Exemplo n.º 3
0
        protected override void OnExecute(IDataMutateContext context, UpsertStatement statement)
        {
            if (context.Data == null)
            {
                return;
            }

            //调用基类同名方法
            base.OnExecute(context, statement);
        }
Exemplo n.º 4
0
        protected override bool OnMutated(IDataMutateContext context, InsertStatement statement, int count)
        {
            //执行获取新增后的自增型字段值
            if (count > 0 && statement.Sequence != null)
            {
                context.Provider.Executor.Execute(context, statement.Sequence);
            }

            return(count > 0);
        }
Exemplo n.º 5
0
        protected override bool OnMutated(IDataMutateContext context, UpsertStatement statement, int count)
        {
            //执行获取新增后的自增型字段值
            if (count > 0 && statement.Sequence != null)
            {
                context.Provider.Executor.Execute(context, statement.Sequence);
            }

            //调用基类同名方法
            return(base.OnMutated(context, statement, count));
        }
Exemplo n.º 6
0
        protected virtual bool OnMutated(IDataMutateContext context, TStatement statement, System.Data.IDataReader reader)
        {
            if (context is DataIncrementContextBase increment)
            {
                if (reader.Read())
                {
                    increment.Result = reader.IsDBNull(0) ? 0 : (long)Convert.ChangeType(reader.GetValue(0), TypeCode.Int64);
                }
                else
                {
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 7
0
        private void Bind(IDataMutateContext context, IEnumerable <IStatementBase> statements)
        {
            if (context.Data == null)
            {
                return;
            }

            foreach (var statement in statements)
            {
                if (statement is IMutateStatement mutation && mutation.Schema != null)
                {
                    //设置子新增语句中的关联参数值
                    this.SetLinkedParameters(mutation, context.Data);

                    //重新计算当前的操作数据
                    context.Data = mutation.Schema.Token.GetValue(context.Data);
                }
            }
        }
Exemplo n.º 8
0
        private bool Mutate(IDataMutateContext context, TStatement statement, System.Data.Common.DbCommand command)
        {
            bool continued;

            //调用写入操作开始方法
            this.OnMutating(context, statement);

            //绑定命令参数
            statement.Bind(context, command, context.Data);

            if (statement.Returning != null && statement.Returning.Table == null)
            {
                using (var reader = command.ExecuteReader())
                {
                    //调用写入操作完成方法
                    continued = this.OnMutated(context, statement, reader);
                }
            }
            else
            {
                //执行数据命令操作
                var count = command.ExecuteNonQuery();

                //累加总受影响的记录数
                context.Count += count;

                //调用写入操作完成方法
                continued = this.OnMutated(context, statement, count);
            }

            //如果需要继续并且有从属语句则尝试绑定从属写操作数据
            if (continued && statement.HasSlaves)
            {
                this.Bind(context, statement.Slaves);
            }

            return(continued);
        }
Exemplo n.º 9
0
        private void Mutate(IDataMutateContext context, IEnumerable <IStatementBase> statements)
        {
            //保存子句集的上级数据
            var data = context.Data;

            foreach (var statement in statements)
            {
                if (statement is IMutateStatement mutation)
                {
                    //设置子新增语句中的关联参数值
                    this.SetLinkedParameters(mutation, context.Data);

                    //重新计算当前的操作数据
                    context.Data = mutation.Schema.Token.GetValue(context.Data);
                }

                //通过内部执行器执行从属语句
                context.Provider.Executor.Execute(context, statement);

                //还原数据上下文的数据
                context.Data = data;
            }
        }
Exemplo n.º 10
0
        protected virtual void OnExecute(IDataMutateContext context, TStatement statement)
        {
            //保存初始的操作数据
            var data = context.Data;

            //根据生成的脚本创建对应的数据命令
            var command = context.Session.Build(statement);

            var count      = 0;
            var keeping    = true;
            var isMultiple = context.IsMultiple;

            if (statement.Schema != null)
            {
                isMultiple = statement.Schema.Token.IsMultiple;
            }

            if (isMultiple && context.Data != null)
            {
                foreach (var item in (IEnumerable)context.Data)
                {
                    //更新当前操作数据
                    context.Data = item;

                    //调用写入操作开始方法
                    this.OnMutating(context, statement);

                    //绑定命令参数
                    statement.Bind(command, item);

                    //执行数据命令操作
                    count = command.ExecuteNonQuery();

                    //累加总受影响的记录数
                    context.Count += count;

                    //调用写入操作完成方法
                    keeping = this.OnMutated(context, statement, count);

                    //如果需要继续并且有子句则执行子句操作
                    if (keeping && statement.HasSlaves)
                    {
                        this.Mutate(context, statement.Slaves);
                    }
                }
            }
            else
            {
                //调用写入操作开始方法
                this.OnMutating(context, statement);

                //绑定命令参数
                statement.Bind(command, context.Data);

                //执行数据命令操作
                count = command.ExecuteNonQuery();

                //累加总受影响的记录数
                context.Count += count;

                //调用写入操作完成方法
                keeping = this.OnMutated(context, statement, count);

                //如果需要继续并且有子句则执行子句操作
                if (keeping && statement.HasSlaves)
                {
                    this.Mutate(context, statement.Slaves);
                }
            }

            //还原上下文的初始数据
            context.Data = data;
        }
Exemplo n.º 11
0
 protected virtual void OnMutating(IDataMutateContext context, TStatement statement)
 {
 }
Exemplo n.º 12
0
 protected virtual bool OnMutated(IDataMutateContext context, TStatement statement, int count)
 {
     return(count > 0);
 }
Exemplo n.º 13
0
        protected virtual bool OnExecute(IDataMutateContext context, TStatement statement)
        {
            if (context.Method != DataAccessMethod.Insert && context.Entity.Immutable)
            {
                throw new DataException($"The '{context.Entity.Name}' is an immutable entity and does not support {context.Method} operation.");
            }

            //根据生成的脚本创建对应的数据命令
            var command = context.Session.Build(statement);

            //获取当前操作是否为多数据
            var isMultiple = context.IsMultiple;

            //保存当前上下文的数据
            var data = context.Data;

            if (statement.Schema != null)
            {
                isMultiple   = statement.Schema.Token.IsMultiple;
                context.Data = statement.Schema.Token.GetValue(context.Data);

                if (context.Data == null)
                {
                    context.Data = data;
                    return(false);
                }
            }

            try
            {
                if (isMultiple)
                {
                    //获取当前一对多导航属性的链接成员标记
                    var tokens = GetLinkTokens(data, statement.Schema);

                    foreach (var item in (IEnumerable)context.Data)
                    {
                        //更新当前操作数据
                        context.Data = item;

                        if (tokens != null && tokens.Length > 0)
                        {
                            var current = item;

                            //依次同步当前集合元素中的导航属性值
                            for (int i = 0; i < tokens.Length; i++)
                            {
                                tokens[i].SetForeignValue(ref current);
                            }

                            context.Data = current;
                        }

                        var continued = this.Mutate(context, statement, command);

                        if (continued && statement.HasSlaves)
                        {
                            foreach (var slave in statement.Slaves)
                            {
                                context.Provider.Executor.Execute(context, slave);
                            }
                        }
                    }

                    return(false);
                }
                else
                {
                    return(this.Mutate(context, statement, command));
                }
            }
            finally
            {
                //还原当前上下文的数据
                context.Data = data;
            }
        }