Ejemplo n.º 1
0
        internal static void Collect()
        {
            lock (__Lock) {
                // Schemas
                __Schemas = Reflector
                            .CollectAttributedObject <Table, IEntity>();

                // TableIndex
                __TableIndex = new Dictionary <string, int>();
                foreach (var schema in __Schemas)
                {
                    __Index++;
                    __TableIndex.Add(
                        schema.Key,
                        __Index
                        );
                }

                // Tables
                __Tables = new Dictionary <string, Table>();
                foreach (var schema in __Schemas)
                {
                    var type  = schema.Value.GetType();
                    var table = new Table()
                    {
                        EntityName  = schema.Value.__EntityName,
                        TableName   = schema.Value.__TableName,
                        Category    = type.GetCategory(),
                        Description = type.GetDescription(),
                        Indexes     = schema.Value.__Indexes,
                        IsView      = type.HasAttribute <View>(),
                        Follow      = type.GetAttribute <DiffFollow>(),
                    };
                    __Tables.Add(schema.Key, table);
                }

                // Columns
                __Columns = new Dictionary <string, List <Column> >();
                foreach (var schema in __Schemas)
                {
                    var columns = new List <Column>();
                    var type    = schema.Value.GetType();
                    var infos   = type.GetProperties();
                    foreach (var info in infos)
                    {
                        var column = info.GetAttribute <Column>();
                        if (null == column)
                        {
                            continue;
                        }

                        //
                        if (column.ColumnName.IsNullOrEmpty())
                        {
                            column.ColumnName = SqlConvention
                                                .ToColumnName(type, info);
                        }

                        column.Property         = info;
                        column.TableName        = schema.Value.__TableName;
                        column.EntityName       = schema.Value.__EntityName;
                        column.AllowDBNull      = info.HasAttribute <AllowDBNull>();
                        column.Identity         = info.HasAttribute <Identity>();
                        column.PrimaryKey       = info.HasAttribute <PrimaryKey>();
                        column.ReadOnly         = info.HasAttribute <ReadOnly>();
                        column.Unique           = info.HasAttribute <Unique>();
                        column.IgnoreDifference = info.HasAttribute <DiffIgnore>();

                        var order = info.GetAttribute <Order>();
                        column.Order = null == order
                                                        ? int.MaxValue
                                                        : order.Index;

                        var maxLength = info.GetAttribute <MaxLength>();
                        if (null != maxLength)
                        {
                            column.MaxLength = maxLength.Size;
                        }

                        column.Category     = info.GetCategory();
                        column.Description  = info.GetDescription();
                        column.DefaultValue = info.GetDefaultValue();

                        columns.Add(column);
                    }
                    columns.OrderBy(x => x.Order);
                    __Columns.Add(schema.Key, columns);
                }

                __Collected = true;
            }

            // __FlatSchema
            __FlatSchema  = new Dictionary <string, IEntity>();
            __FlatColumns = new Dictionary <string, List <Column> >();
            foreach (var schema in __Schemas)
            {
                var value = schema.Value;

                //
                __FlatSchema.SafeAdd(
                    value.GetType().FullName.ToUpper(), value
                    );
                __FlatSchema.SafeAdd(
                    value.__EntityName.ToUpper(), value
                    );
                __FlatSchema.SafeAdd(
                    value.__TableName.ToUpper(), value
                    );
                __FlatSchema.SafeAdd(
                    value.__Alias.ToUpper(), value
                    );

                //
                List <Column> columns = __Columns[schema.Key];
                __FlatColumns.SafeAdd(
                    value.GetType().FullName.ToUpper(), columns
                    );
                __FlatColumns.SafeAdd(
                    value.__EntityName.ToUpper(), columns
                    );
                __FlatColumns.SafeAdd(
                    value.__TableName.ToUpper(), columns
                    );
                __FlatColumns.SafeAdd(
                    value.__Alias.ToUpper(), columns
                    );
            }

            // __FlatTable
            __FlatTable = new Dictionary <string, Table>();
            foreach (var tableKV in __Tables)
            {
                var schema = __FlatSchema[tableKV.Key.ToUpper()];

                __FlatTable.SafeAdd(
                    schema.GetType().FullName.ToUpper(), tableKV.Value
                    );
                __FlatTable.SafeAdd(
                    schema.__EntityName.ToUpper(), tableKV.Value
                    );
                __FlatTable.SafeAdd(
                    schema.__TableName.ToUpper(), tableKV.Value
                    );
                __FlatTable.SafeAdd(
                    schema.__Alias.ToUpper(), tableKV.Value
                    );
            }


            // __FlatColumn
            __FlatColumn = new Dictionary <string, Column>();
            foreach (var columnsKV in __Columns)
            {
                foreach (var one in columnsKV.Value)
                {
                    __FlatColumn.Add(one.Alias, one);
                }
            }
        }