public SimpleCommandBuilder(TableMeta tableMeta)
        {
            _tableMeta = tableMeta;

            var builder = tableMeta.DbMeta.DbProvider.CreateCommandMetaBuilder(tableMeta.DbMeta);

            _insertCommandMeta = builder.BuildInsertCommandMeta(tableMeta);
            _updateCommandMeta = builder.BuildUpdateCommandMeta(tableMeta);
            _deleteCommandMeta = builder.BuildDeleteCommandMeta(tableMeta);
            _getByIdCommandMeta = builder.BuildGetByIdCommandMeta(tableMeta);
        }
        public CommandMeta BuildDeleteCommandMeta(TableMeta table)
        {
            var columns = table.Columns;

            var parameterMeta = new Dictionary<string, ColumnMeta>();

            var sql = new StringBuilder()
                .Append("DELETE FROM [")
                .Append(table.TableName)
                .Append("]");

            BuildIdentityWhere(columns, parameterMeta, sql);

            return new CommandMeta
            {
                CommandText = sql.ToString(),
                ParameterMeta = parameterMeta
            };
        }
        public CommandMeta BuildGetByIdCommandMeta(TableMeta table)
        {
            var columns = table.Columns;

            var parameterMeta = new Dictionary<string, ColumnMeta>();

            var sql = new StringBuilder()
                .Append("SELECT ")
                .Append(String.Join(",", columns.Select(c => $"[{c.ColumnName}]")))
                .Append(" FROM [")
                .Append(table.TableName)
                .Append("]");

            BuildIdentityWhere(columns, parameterMeta, sql);

            return new CommandMeta
            {
                CommandText = sql.ToString(),
                ParameterMeta = parameterMeta
            };
        }
        public CommandMeta BuildInsertCommandMeta(TableMeta table)
        {
            var columns = table.Columns;

            var sql = new StringBuilder()
                .Append("INSERT INTO [")
                .Append(table.TableName)
                .Append("] (")
                .Append(String.Join(",", columns.Where(c => !c.AutoIncrement).Select(c => String.Format("[{0}]", c.ColumnName))))
                .Append(") VALUES (");

            var parameterMeta = new Dictionary<string, ColumnMeta>();

            var comma = "";
            foreach (var column in columns.Where(c => !c.AutoIncrement))
            {
                var paramName = $"p{parameterMeta.Count}";

                sql.Append(comma)
                    .Append("@")
                    .Append(paramName);

                parameterMeta.Add(paramName, column);

                comma = ",";
            }

            sql.Append(")");

            if (!table.AssociationTable)
            {
                sql.Append("; SELECT SCOPE_IDENTITY();");
            }

            return new CommandMeta
            {
                CommandText = sql.ToString(),
                ParameterMeta = parameterMeta
            };
        }
        public CommandMeta BuildUpdateCommandMeta(TableMeta table)
        {
            var columns = table.Columns;

            var parameterMeta = new Dictionary<string, ColumnMeta>();

            var sql = new StringBuilder()
                .Append("UPDATE [")
                .Append(table.TableName)
                .Append("] SET ");

            var comma = "";
            foreach (var column in columns.Where(c => !c.Identity))
            {
                var paramName = $"p{parameterMeta.Count}";

                sql.Append(comma)
                    .AppendFormat("[{0}]=@{1}", column.ColumnName, paramName);

                parameterMeta.Add(paramName, column);

                comma = ",";
            }

            BuildIdentityWhere(columns, parameterMeta, sql);

            return new CommandMeta
            {
                CommandText = sql.ToString(),
                ParameterMeta = parameterMeta
            };
        }