public Table(Type memberType, JoinType joinType) { EntityType = memberType; Name = memberType.GetTableName(); JoinType = joinType; Columns = MapRepository.Instance.GetColumns(memberType); }
public static void CreateTableForType(Type type, bool recreate) { var ret = ""; var tableName = type.GetTableName(); if (recreate && ExistTable(tableName)) { DropTable(tableName); } string identityField = type.GetIdentityName(); ret += "CREATE TABLE [" + tableName + "] (\n"; ret += "[" + identityField + "] [int] IDENTITY(1,1) NOT NULL,\n"; foreach (PropertyInfo pi in type.GetProperties().Where(pi => pi.CanWrite)) { if (pi.IsIdentityField()) continue; var mta = pi.GetCustomAttributes(typeof (MappedFieldAttribute), true).FirstOrDefault() as MappedFieldAttribute; if (mta == null ) continue; if (mta.Computed) continue; var columnName = pi.GetColumnName(); string dbType = pi.GetDbType(); ret += "[" + columnName + "] " + dbType + ",\n"; } ret += "CONSTRAINT [PK_" + tableName + "] PRIMARY KEY CLUSTERED (\n"; ret += "\t[" + identityField + "] ASC\n)"; foreach (PropertyInfo pi in type.GetProperties().Where(pi => pi.IsUnique())) { var columnName = pi.GetColumnName(); ret += ", CONSTRAINT [Unique_" + tableName + "_" + columnName + "] UNIQUE NONCLUSTERED (\n"; ret += "\t[" + columnName + "] ASC\n)"; } ret += "\n)"; DataHelper.NonQuery(ret, CommandType.Text); }
private static void UpdateTableColumns(Type type) { var tableName = type.GetTableName(); var dt = DataHelper.QueryToDataTable("SELECT * FROM [" + tableName + "]", CommandType.Text); new List<PropertyInfo>(); foreach (var pi in type.GetProperties().Where(x => x.GetCustomAttributes(typeof(MappedFieldAttribute), true).Any() && x.CanWrite)) { var columnName = pi.GetColumnName(); var columnType = pi.GetDbType(); if (dt.Columns.Contains(columnName)) continue; var alterCommand = "ALTER TABLE [" + tableName + "] ADD [" + columnName + "] " + columnType; DataHelper.NonQuery(alterCommand, CommandType.Text); } }
private static void UpdateForeignKeys(Type type) { foreach (PropertyInfo pi in type.GetProperties().Where(pi => pi.GetReferencedType() != null)) { var type2 = pi.GetReferencedType(); var foreignKeyName = "dbo.FK_" + type.GetTableName() + "_" + type2.GetTableName(); var dropQuery = @" IF EXISTS (SELECT * FROM sys.foreign_keys WHERE name = '" + foreignKeyName + @"' AND parent_object_id = OBJECT_ID(N'dbo." + type.GetTableName() + @"') ) ALTER TABLE [" + type.GetTableName() + "] DROP CONSTRAINT [" + foreignKeyName + @"] "; DataHelper.NonQuery(dropQuery, CommandType.Text); var createQuery = @"ALTER TABLE [dbo].[" + type.GetTableName() + @"] WITH CHECK ADD CONSTRAINT [" + foreignKeyName + @"] FOREIGN KEY([" + pi.GetColumnName() + @"]) REFERENCES [dbo].[" + type2.GetTableName() + @"] ([" + type2.GetIdentityName() + @"])"; DataHelper.NonQuery(createQuery, CommandType.Text); } }
private static void UpdateComputedFields(Type type) { var tableName = type.GetTableName(); foreach (var pi in type.GetProperties().Where(x => x.GetCustomAttributes(typeof(MappedFieldAttribute), true).Any() && x.CanWrite)) { var mta = pi.GetCustomAttributes(typeof(MappedFieldAttribute), true).FirstOrDefault() as MappedFieldAttribute; if (mta == null) throw new NullReferenceException("Property '" + pi.Name + "' in class '" + type.Name + "' has no MappedField attribute.."); if (!mta.Computed || string.IsNullOrEmpty(mta.ComputedFormula)) continue; var columnName = pi.GetColumnName(); var dropCommand = "ALTER TABLE [" + tableName + "] DROP COLUMN [" + columnName + "] " ; DataHelper.NonQuery(dropCommand, CommandType.Text); var alterCommand = "ALTER TABLE [" + tableName + "] ADD [" + columnName + "] AS " + mta.ComputedFormula; DataHelper.NonQuery(alterCommand, CommandType.Text); } }
/// <summary> /// 获取表名 /// </summary> /// <param name="type"></param> /// <returns></returns> public static string GetTableName(Type type) { return _tableNameCache.Get(type, () => type.GetTableName()); }
/// <summary> /// 获取所有列名 /// </summary> /// <param name="type"></param> /// <returns></returns> public static Tuple<string, string[]> GetColumns(Type type, string connectionStringName) { return _typeColumnsCache.Get(type, () => { if (!type.IsTable()) { throw new ArgumentException("不是映射实体", "type"); } return new Tuple<string, string[]>(type.GetTableName(), type.GetTableColumnNames().ToArray()); }); }
static string getForeignKeyName(Type referencingType, Type referencedType) { return string.Format("FK_{0}_{1}", referencingType.GetTableName(), referencedType.GetTableName()); }