nHydrate.DataImport.SqlClient.ImportDomain.GetEntity C# (CSharp) Method

GetEntity() public method

public GetEntity ( string connectionString, string name, IEnumerable auditFields ) : System.Entity
connectionString string
name string
auditFields IEnumerable
return System.Entity
        public Entity GetEntity(string connectionString, string name, IEnumerable<SpecialField> auditFields)
        {
            var database = new Database();
            database.Collate = DatabaseHelper.GetDatabaseCollation(connectionString);

            #region Load Entities
            using (var tableReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlDatabaseTables()))
            {
                while (tableReader.Read())
                {
                    var newEntity = new Entity();
                    newEntity.Name = tableReader["name"].ToString();
                    if (string.Compare(newEntity.Name, name, true) == 0) //Only the specified item
                        database.EntityList.Add(newEntity);
                    newEntity.Schema = tableReader["schema"].ToString();
                }
            }
            #endregion

            #region Load Entity Fields
            using (var columnReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlColumnsForTable(name)))
            {
                while (columnReader.Read())
                {
                    var columnName = columnReader["columnName"].ToString();
                    var tableName = columnReader["tableName"].ToString();

                    var entity = database.EntityList.FirstOrDefault(x => x.Name == tableName);
                    //Ensure the field name is not an Audit field
                    if (entity != null && !auditFields.Any(x => x.Name.ToLower() == columnName.ToLower()))
                    {
                        var maxSortOrder = 0;
                        if (entity.FieldList.Count > 0) maxSortOrder = entity.FieldList.Max(x => x.SortOrder);
                        var newColumn = new Field() { Name = columnName, SortOrder = ++maxSortOrder };
                        entity.FieldList.Add(newColumn);

                        newColumn.Nullable = bool.Parse(columnReader["allowNull"].ToString());
                        if (bool.Parse(columnReader["isIdentity"].ToString()))
                            newColumn.Identity = true;

                        if (columnReader["isPrimaryKey"] != System.DBNull.Value)
                            newColumn.PrimaryKey = true;

                        try
                        {
                            newColumn.DataType = DatabaseHelper.GetSQLDataType(columnReader["xtype"].ToString(), database.UserDefinedTypes);
                        }
                        catch { }

                        var defaultvalue = columnReader["defaultValue"].ToString();
                        SetupDefault(newColumn, defaultvalue);

                        newColumn.Length = (int)columnReader["length"];

                        //Decimals are a little different
                        if (newColumn.DataType == SqlDbType.Decimal)
                        {
                            newColumn.Length = (byte)columnReader["precision"];
                            newColumn.Scale = (int)columnReader["scale"];
                        }

                        if (columnReader["collation"] != System.DBNull.Value)
                        {
                            if (database.Collate != (string)columnReader["collation"])
                                newColumn.Collate = (string)columnReader["collation"];
                        }

                    }
                    else if (entity != null)
                    {
                        if (auditFields.Any(x => (x.Type == SpecialFieldTypeConstants.CreatedDate ||
                            x.Type == SpecialFieldTypeConstants.CreatedBy) &&
                            x.Name.ToLower() == columnName.ToLower()))
                        {
                            entity.AllowCreateAudit = true;
                        }

                        if (auditFields.Any(x => (x.Type == SpecialFieldTypeConstants.ModifedDate ||
                            x.Type == SpecialFieldTypeConstants.ModifiedBy) &&
                            x.Name.ToLower() == columnName.ToLower()))
                        {
                            entity.AllowModifyAudit = true;
                        }

                        if (auditFields.Any(x => x.Type == SpecialFieldTypeConstants.Timestamp &&
                            x.Name.ToLower() == columnName.ToLower()))
                        {
                            entity.AllowTimestamp = true;
                        }

                        if (auditFields.Any(x => x.Type == SpecialFieldTypeConstants.Tenant &&
                            x.Name.ToLower() == columnName.ToLower()))
                        {
                            entity.IsTenant = true;
                        }

                    }
                }
            }
            #endregion

            #region Load Entity Fields Extra
            using (var indexReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlIndexesForTable()))
            {
                while (indexReader.Read())
                {
                    var indexName = indexReader["indexname"].ToString();
                    var columnName = indexReader["columnname"].ToString();
                    var tableName = indexReader["tableName"].ToString();
                    var entity = database.EntityList.FirstOrDefault(x => x.Name == tableName);
                    if (entity != null)
                    {
                        var pk = bool.Parse(indexReader["is_primary_key"].ToString());
                        var column = entity.FieldList.FirstOrDefault(x => x.Name == columnName);
                        if (column != null && !pk)
                            column.IsIndexed = true;
                    }
                }
            }
            #endregion

            LoadIndexes(database, connectionString);
            LoadUniqueFields(database, connectionString);

            return database.EntityList.FirstOrDefault();

        }