private static string CreateTable(MetaTable metaTable) { Dictionary <string, MetaDataMember> members = new Dictionary <string, MetaDataMember>(); HashSet <string> associations = new HashSet <string>(); StringBuilder tableDef = new StringBuilder(); tableDef.AppendFormat("CREATE TABLE [{0}](", metaTable.TableName); IEnumerable <MetaType> types = new MetaType[] { metaTable.RowType }; types = types.Concat(metaTable.RowType.DerivedTypes); foreach (MetaType type in types) { foreach (MetaDataMember member in type.DataMembers) { if (!member.IsPersistent || member.Association != null) { continue; } if (member.DbType == null) { throw new Exception(string.Format("DbType not specified in member \"{0}\" in table \"{1}\".", member.MappedName, metaTable.TableName)); } if (members.ContainsKey(member.MappedName)) { MetaDataMember oldMember = members[member.MappedName]; if (oldMember.CanBeNull != member.CanBeNull || oldMember.DbType != member.DbType || oldMember.IsPrimaryKey != member.IsPrimaryKey) { throw new Exception(string.Format("Member \"{0}\" in table \"{1}\" already specified.", member.MappedName, metaTable.TableName)); } } else { members[member.MappedName] = member; tableDef.AppendFormat("[{0}] {1} {2},\r\n", member.MappedName, member.DbType, member.CanBeNull ? "NULL" : "NOT NULL"); } } } bool isPrimaryKey = false; foreach (MetaDataMember member in members.Values.Where(a => a.IsPrimaryKey)) { if (!isPrimaryKey) { tableDef.Append("PRIMARY KEY ("); } tableDef.AppendFormat("[{0}], ", member.MappedName); isPrimaryKey = true; } if (isPrimaryKey) { tableDef.Remove(tableDef.Length - 2, 2); tableDef.Append("),\r\n"); } foreach (MetaType type in types) { foreach (MetaAssociation assoc in type.Associations.Where(a => a.IsForeignKey)) { StringBuilder assocStr = new StringBuilder(); assocStr.Append("FOREIGN KEY ("); foreach (MetaDataMember member in assoc.ThisKey) { assocStr.AppendFormat("[{0}], ", member.MappedName); } assocStr.Remove(assocStr.Length - 2, 2); assocStr.AppendFormat(") REFERENCES [{0}](", assoc.OtherType.Table.TableName); foreach (MetaDataMember member in assoc.OtherKey) { assocStr.AppendFormat("[{0}], ", member.MappedName); } assocStr.Remove(assocStr.Length - 2, 2); assocStr.Append(")"); associations.Add(assocStr.ToString()); } } foreach (string assocStr in associations) { tableDef.Append(assocStr + ",\r\n"); } tableDef.Remove(tableDef.Length - 3, 3); tableDef.Append(")"); return(tableDef.ToString()); }