public static SchemaInfo GetSchemaFromAssembly(System.Reflection.Assembly ass) { SchemaInfo schemaInfo = (SchemaInfo)assembly2SchemaInfo[ass]; if (schemaInfo == null) { lock (typeof(SchemaLoader)) { schemaInfo = (SchemaInfo)assembly2SchemaInfo[ass]; if (schemaInfo == null) { foreach (string name in ass.GetManifestResourceNames()) { if (name.EndsWith("_DBSchema.bin")) { System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); using (Stream resourceStream = ass.GetManifestResourceStream(name)) { schemaInfo = (SchemaInfo)bf.Deserialize(resourceStream); schemaInfo.Resolve(); } break; } if (name.EndsWith("_DBSchema.xml")) { using (Stream resourceStream = ass.GetManifestResourceStream(name)) { XmlSerializer ser = new XmlSerializer(typeof(SchemaInfo)); XmlTextReader reader = new XmlTextReader(resourceStream); schemaInfo = (SchemaInfo)ser.Deserialize(reader); schemaInfo.Resolve(); } break; } } if (schemaInfo == null) { throw new InvalidOperationException("_DBSchema.xml not embedded in " + ass.CodeBase); } assembly2SchemaInfo[ass] = schemaInfo; } } } return(schemaInfo); }
public override int Run(string[] args) { SchemaImporter importer = null; switch (DatabaseType) { case "mssql": case "sqlserver": importer = new MSSqlSchemaImporter(); break; } SchemaInfo schemaInfo = importer.GetSchemaFromDatabase(this); AutoDetectRelations(schemaInfo); schemaInfo.Resolve(); RemoveReferencePrimaryKeys(schemaInfo); AutoDetectCollections(schemaInfo); DataSourceInfo dsi = new DataSourceInfo(); dsi.Name = "default"; dsi.DataSourceType = "Sooda.Sql.SqlDataSource"; schemaInfo.DataSources.Add(dsi); foreach (ClassInfo ci in schemaInfo.Classes) { int pkCount = 0; foreach (FieldInfo fi in ci.LocalTables[0].Fields) { if (fi.IsPrimaryKey) { pkCount++; } } if (pkCount == 0) { Console.WriteLine("WARNING: Table {0} doesn't have a primary key.", ci.Name); } } XmlSerializer ser = new XmlSerializer(typeof(SchemaInfo)); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", SchemaInfo.XmlNamespace); using (FileStream fs = File.Create(OutputFile)) { ser.Serialize(fs, schemaInfo, ns); } return(0); }