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); }
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)); } }
protected override void OnExecute(IDataMutateContext context, UpsertStatement statement) { if (context.Data == null) { return; } //调用基类同名方法 base.OnExecute(context, statement); }
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); }
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)); }
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); }
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); } } }
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); }
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; } }
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; }
protected virtual void OnMutating(IDataMutateContext context, TStatement statement) { }
protected virtual bool OnMutated(IDataMutateContext context, TStatement statement, int count) { return(count > 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; } }