private static void InitColumns()
        {
            var columnIndex = 0;
            var columns     = EntityType.GetProperties()
                              .Where(propInfo => propInfo.GetCustomAttribute <NotMappedAttribute>() == null)
                              .ToDictionary((propInfo) => propInfo.Name,
                                            (propInfo) =>
            {
                var column = propInfo.GetCustomAttribute <ColumnAttribute>() ??
                             new ColumnAttribute(propInfo.Name)
                {
                    IsPrimaryKey = String.Equals(propInfo.Name, DEFAULT_ID_NAME,
                                                 StringComparison.CurrentCultureIgnoreCase)
                };
                column.Property = propInfo;
                if (String.IsNullOrEmpty(column.Name))
                {
                    column.Name = propInfo.Name;
                }

                if (column.FieldType == null)
                {
                    column.FieldType = Nullable.GetUnderlyingType(propInfo.PropertyType) ??
                                       propInfo.PropertyType;
                }

                if (propInfo.GetMethod != null && column.GetPropertyValue == null)
                {
                    column.GetPropertyValue = GetAccessorFactory.Create(propInfo);
                }

                if (!column.Ordinal.HasValue)
                {
                    column.Ordinal = columnIndex;
                }

                if (column.IsPrimaryKey)
                {
                    MetaData.PrimaryKey = column;
                }

                columnIndex++;
                return(column);
            });

            MetaData.Columns = new SortedDictionary <string, ColumnAttribute>(columns);
            var indexColMap = MetaData.Columns.ToDictionary((col) =>
            {
                if (!col.Value.Ordinal.HasValue)
                {
                    throw new SmartSqlException(
                        $"Entity:{EntityType.FullName} {col.Value.Name}.Ordinal can not be null.");
                }

                return(col.Value.Ordinal.Value);
            }, col => col.Value);

            IndexColumnMaps = new SortedDictionary <int, ColumnAttribute>(indexColMap);
        }