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();
}