Exemplo n.º 1
0
        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());
        }