Пример #1
0
        protected virtual bool OnExecute(DataUpsertContext context, SelectStatement statement)
        {
            //根据生成的脚本创建对应的数据命令
            var command = context.Session.Build(statement);

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

            using (var reader = command.ExecuteReader())
            {
                if (reader.Read())
                {
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        var schema = string.IsNullOrEmpty(statement.Alias) ? context.Schema.Find(reader.GetName(i)) : context.Schema.Find(statement.Alias);

                        if (schema != null)
                        {
                            if (schema.Token.Property.IsComplex && schema.Children.TryGet(reader.GetName(i), out var child))
                            {
                                schema = child;
                            }

                            schema.Token.SetValue(context.Data, reader.GetValue(i));
                        }
                    }
                }
            }

            return(true);
        }
        private void BuildUpsertion(DataUpdateContext context, object data, IStatementBase master, SchemaMember schema)
        {
            var entityType = schema.Parent == null ? context.EntityType : schema.Parent.Token.MemberType;

            //构建 Upsert 操作上下文
            var upsert = new DataUpsertContext(
                context.DataAccess,
                schema.Token.Property.Entity.Name,
                true,
                data,
                new Schema(schema.Token.Property.Entity, entityType, schema),
                context.HasStates ? context.States : null);

            //构建 Upsert 语句
            var statements = context.Source.Driver.Builder.Build(upsert);

            //将新建的语句加入到主语句的从属集中
            foreach (var statement in statements)
            {
                master.Slaves.Add(statement);
            }
        }