/// <summary> /// Generates create table commands for the supplied type /// </summary> internal static void CreateTable <T>(StringBuilder tables, Type type, StringBuilder constraints, StringBuilder manyToManyTables) { tables.AppendLine("CREATE TABLE [" + type.Name + "] ( "); foreach (var pi in DwarfHelper.GetDBProperties(type)) { tables.AppendLine(TypeToColumnName(pi) + " " + TypeToColumnConstruction(type, pi.ContainedProperty)); } foreach (var pi in DwarfHelper.GetGemListProperties(type)) { tables.AppendLine(TypeToColumnName(pi) + " " + TypeToColumnConstruction(type, pi.ContainedProperty)); } foreach (var manyToManyProperty in DwarfHelper.GetManyToManyProperties(type)) { CreateManyToManyTable(type, manyToManyProperty, manyToManyTables, constraints); } var keys = String.Empty; foreach (var propertyInfo in DwarfHelper.GetPKProperties(type)) { keys += TypeToColumnName(propertyInfo) + ", "; } if (!string.IsNullOrEmpty(keys)) { keys = keys.TruncateEnd(2); keys = "CONSTRAINT [PK_" + type.Name + "] PRIMARY KEY (" + keys + ")"; tables.AppendLine(keys); } foreach (var pi in DwarfHelper.GetFKProperties <T>(type)) { var constraintName = "FK_" + type.Name + "_" + pi.Name; var alterTable = "ALTER TABLE [" + type.Name + "] ADD CONSTRAINT [" + constraintName + "Id] FOREIGN KEY (" + pi.Name + "Id) REFERENCES [" + pi.PropertyType.Name + "] (Id)"; if (!DwarfPropertyAttribute.GetAttribute(pi.ContainedProperty).DisableDeleteCascade) { alterTable += " ON DELETE CASCADE "; } constraints.AppendLine(alterTable); } CreateUniqueConstraint <T>(constraints, type); tables.AppendLine(") "); tables.AppendLine(); }