private List <nHydrateGeneratorProject> BuildModelList(nHydrateModel model, Microsoft.VisualStudio.Modeling.Diagrams.Diagram diagram, Microsoft.VisualStudio.Modeling.Shell.ModelingDocData docData) { var genList = new List <nHydrateGeneratorProject>(); var genProject = new nHydrateGeneratorProject(); genList.Add(genProject); var root = CreatePOCOModel(model, diagram); root.SetKey(model.Id.ToString()); root.GeneratorProject = genProject; genProject.RootController.Object = root; var fi = new System.IO.FileInfo(docData.FileName); genProject.FileName = docData.FileName + ".generating"; var document = new System.Xml.XmlDocument(); document.LoadXml("<modelRoot guid=\"" + model.Id + "\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>"); ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)root).XmlAppend(document.DocumentElement.ChildNodes[0]); System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString()); ProcessRenamed(genProject.FileName + ".sql.lastgen", root); root.RemovedTables.AddRange(model.RemovedTables); //NOTE: This caused diff scripts to be generated EVERY time so removed for now //Remove associative tables since they cause issues if they exist //root.RemovedTables.AddRange(model.Entities.Where(x => x.IsAssociative && x.IsGenerated).Select(x => x.Name)); root.RemovedViews.AddRange(model.RemovedViews); //Remove EnumOnly type-tables from the project root.RemovedTables.AddRange(model.Entities.Where(x => x.TypedEntity == TypedEntityConstants.EnumOnly).Select(x => x.Name)); return(genList); }
private static void ProcessRenamed(string lastGenFile, ModelRoot root) { if (!File.Exists(lastGenFile)) { return; } var genProjectLast = new nHydrateGeneratorProject(); var xDoc = new XmlDocument(); xDoc.Load(lastGenFile); genProjectLast.XmlLoad(xDoc.DocumentElement); var oldRoot = (genProjectLast.RootController.Object as nHydrate.Generator.Models.ModelRoot); foreach (nHydrate.Generator.Models.Table t in root.Database.Tables) { //Find renamed tables { var renamedItem = oldRoot.Database.Tables.FirstOrDefault(x => x.Key == t.Key && x.PascalName.ToLower() != t.PascalName.ToLower()); if (renamedItem != null) { root.RemovedTables.Add(renamedItem.Name); } } //Find renamed views { var renamedItem = oldRoot.Database.CustomViews.FirstOrDefault(x => x.Key == t.Key && x.PascalName.ToLower() != t.PascalName.ToLower()); if (renamedItem != null) { root.RemovedViews.Add(renamedItem.Name); } } //Find tables that WERE generated last time but NOT generated this time, remove the tables { var item1 = oldRoot.Database.Tables.FirstOrDefault(x => x.Key == t.Key && x.PascalName.ToLower() == t.PascalName.ToLower()); var item2 = root.Database.Tables.FirstOrDefault(x => x.Key == t.Key && x.PascalName.ToLower() != t.PascalName.ToLower()); if (item1 != null && item2 != null) { root.RemovedTables.Add(item2.Name); } } } }
private void wizard1_BeforeSwitchPages(object sender, nHydrate.Wizard.Wizard.BeforeSwitchPagesEventArgs e) { if (e.OldIndex == 0) { this.Cursor = Cursors.WaitCursor; try { DatabaseConnectionControl1.PersistSettings(); var connectionString = DatabaseConnectionControl1.ImportOptions.GetConnectionString(); if (!SqlSchemaToModel.IsValidConnectionString(connectionString)) { this.Cursor = Cursors.Default; e.Cancel = true; MessageBox.Show("This not a valid connection string!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //Setup new model var project = new nHydrateGeneratorProject(); SqlSchemaToModel.SetupNewProject(project, connectionString); this.NewDatabase = (project.Model as ModelRoot).Database; SqlSchemaToModel.GetProjectFromSqlSchema(project, connectionString, false, chkInheritance.Checked); //Load the tree this.Populate(); if (!this.AreChanges()) { this.Cursor = Cursors.Default; e.Cancel = true; MessageBox.Show("This model is up-to-date. There are no changes to refresh.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception) { throw; } finally { this.Cursor = Cursors.Default; } } }
/* * --model=C:\code\nHydrateTestAug\ConsoleApp1\Model1.nhydrate --output=C:\code\nHydrateTestAug --generators=nHydrate.Generator.EFCodeFirstNetCore.EFCodeFirstNetCoreProjectGenerator,nHydrate.Generator.PostgresInstaller.PostgresDatabaseProjectGenerator,nHydrate.Generator.SQLInstaller.Core.DatabaseProjectGenerator */ static int Main(string[] args) { IConfiguration Configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile("appsettings.development.json", optional: true, reloadOnChange: true) .AddCommandLine(args) .Build(); var modelFile = string.Empty; var output = string.Empty; var generators = new string[0]; //AppSettings var allValues = Configuration.GetChildren().Select(x => new { x.Key, x.Value }).ToDictionary(x => x.Key.ToString(), x => x.Value?.ToString()); if (allValues.ContainsKey(ModelKey)) { modelFile = allValues[ModelKey]; } if (allValues.ContainsKey(OutputKey)) { output = allValues[OutputKey]; } if (allValues.ContainsKey(GeneratorsKey)) { generators = allValues[GeneratorsKey].Split(",", StringSplitOptions.RemoveEmptyEntries); } if (modelFile.IsEmpty()) { return(ShowError("The model is required.")); } if (output.IsEmpty()) { return(ShowError("The output folder is required.")); } //If there are no generators specified on the command line then check for the file "nhydrate.generators" if (!generators.Any()) { var folderName = (new FileInfo(modelFile)).DirectoryName; var genDefFile = Path.Combine(folderName, "nhydrate.generators"); if (File.Exists(genDefFile)) { generators = File.ReadAllLines(genDefFile).Where(x => x.Trim() != string.Empty).ToArray(); } if (!generators.Any()) { return(ShowError("The generators are required.")); } } Console.WriteLine($"modelFile='{modelFile}'"); Console.WriteLine($"output='{output}'"); Console.WriteLine($"generators='{string.Join(",", generators)}'"); //NOTE: Yaml Model files must end with ".nhydrate.yaml" //Old Xml file ends with ".nhydrate" //Specified a folder so look for the file string actualFile = null; if (Directory.Exists(modelFile)) { var folderName = modelFile; //Look for new Yaml file var f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } //Look for old xml file if (actualFile.IsEmpty()) { f = Directory.GetFiles(folderName, "*" + FileManagement.OldModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } } if (actualFile.IsEmpty()) { //Back 1 folder folderName = (new DirectoryInfo(folderName)).Parent.FullName; f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } //Look for old xml file if (actualFile.IsEmpty()) { f = Directory.GetFiles(folderName, "*" + FileManagement.OldModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } } } } else { //Is this the Yaml model? if (modelFile.EndsWith(FileManagement.ModelExtension)) { actualFile = modelFile; } //Is this the Xml model? if (modelFile.EndsWith(FileManagement.OldModelExtension)) { actualFile = modelFile; } //Look one folder back for Yaml if (actualFile.IsEmpty()) { var folderName = (new FileInfo(modelFile)).Directory.Parent.FullName; var f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } } } if (actualFile.IsEmpty()) { return(ShowError("Model file not found.")); } modelFile = actualFile; var timer = System.Diagnostics.Stopwatch.StartNew(); var formatModel = (allValues.ContainsKey("formatmodel") && allValues["formatmodel"] == "true"); //TODO: when model files missing ID, it generates all fields as first one nHydrate.Generator.Common.Models.ModelRoot model = null; try { Console.WriteLine(); Console.WriteLine("Loading model..."); model = ModelHelper.CreatePOCOModel(modelFile, formatModel); } catch (ModelException ex) { //All YAML validation errors will come here Console.WriteLine(ex.Message); return(1); } catch (Exception ex) { Console.WriteLine("Unknown error."); return(1); } //Generate if (model != null && !formatModel) { Console.WriteLine("Loading generators..."); var genHelper = new nHydrate.Command.Core.GeneratorHelper(output); genHelper.ProjectItemGenerated += new nHydrate.Generator.Common.GeneratorFramework.ProjectItemGeneratedEventHandler(g_ProjectItemGenerated); var genList = new List <nHydrateGeneratorProject>(); var genProject = new nHydrateGeneratorProject(); genList.Add(genProject); model.ResetKey(model.Key); model.GeneratorProject = genProject; genProject.Model = model; genProject.FileName = $"{modelFile}.generating"; var document = new System.Xml.XmlDocument(); document.LoadXml($"<modelRoot guid=\"{model.Key}\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>"); ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)model).XmlAppend(document.DocumentElement.ChildNodes[0]); System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString()); var allgenerators = genHelper.GetProjectGenerators(genProject); var excludeList = allgenerators.Where(x => !generators.Contains(x.FullName)).ToList(); //Get the last version we generated on this machine //We will use this to determine if any other generations have been performed on other machines var cacheFile = new nHydrate.Generator.Common.ModelCacheFile(genList.First()); var cachedGeneratedVersion = cacheFile.GeneratedVersion; var generatedVersion = cachedGeneratedVersion + 1; model.GeneratedVersion = generatedVersion; Console.WriteLine($"Generating code..."); foreach (var item in genList) { genHelper.GenerateAll(item, excludeList); } //Save local copy of last generated version cacheFile.GeneratedVersion = generatedVersion; cacheFile.ModelerVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; cacheFile.Save(); if (File.Exists(genProject.FileName)) { File.Delete(genProject.FileName); } //Write stats Console.WriteLine(); Console.WriteLine("Generation Summary"); Console.WriteLine($"Total Files: {_stats.ProcessedFileCount}"); Console.WriteLine($"Files Success: {_stats.FilesSuccess}"); Console.WriteLine($"Files Skipped: {_stats.FilesSkipped}"); Console.WriteLine($"Files Failed: {_stats.FilesFailed}"); Console.WriteLine(); } else if (!formatModel) { Console.WriteLine("The model could not be loaded."); } timer.Stop(); Console.WriteLine($"Generation complete. Elapsed={timer.ElapsedMilliseconds}ms"); return(0); }
/* * /model:C:\code\nHydrateTestAug\ConsoleApp1\Model1.nhydrate /output:C:\code\nHydrateTestAug /generators:nHydrate.Generator.EFCodeFirstNetCore.EFCodeFirstNetCoreProjectGenerator,nHydrate.Generator.PostgresInstaller.PostgresDatabaseProjectGenerator,nHydrate.Generator.SQLInstaller.Core.DatabaseProjectGenerator */ static int Main(string[] args) { var commandParams = GetCommandLineParameters(); if (!commandParams.ContainsKey(ModelKey)) { return(ShowError("The model is required.")); } if (!commandParams.ContainsKey(OutputKey)) { return(ShowError("The output folder is required.")); } if (!commandParams.ContainsKey(GeneratorsKey)) { return(ShowError("The generators are required.")); } var modelFile = commandParams[ModelKey]; var output = commandParams[OutputKey]; var generators = commandParams[GeneratorsKey].Split(",", StringSplitOptions.RemoveEmptyEntries); nHydrate.Generator.Common.Models.ModelRoot model = null; try { model = ModelHelper.CreatePOCOModel(modelFile); } catch (ModelException ex) { Console.WriteLine(ex.Message); return(1); } catch (Exception ex) { Console.WriteLine("Unknown error."); return(1); } //Generate if (model != null) { var genHelper = new nHydrate.Command.Core.GeneratorHelper(output); var genList = new List <nHydrateGeneratorProject>(); var genProject = new nHydrateGeneratorProject(); genList.Add(genProject); model.SetKey(model.Id.ToString()); model.GeneratorProject = genProject; genProject.Model = model; genProject.FileName = modelFile + ".generating"; var document = new System.Xml.XmlDocument(); document.LoadXml("<modelRoot guid=\"" + model.Id + "\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>"); ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)model).XmlAppend(document.DocumentElement.ChildNodes[0]); System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString()); var allgenerators = genHelper.GetProjectGenerators(genProject); var excludeList = allgenerators.Where(x => !generators.Contains(x.FullName)).ToList(); foreach (var item in genList) { genHelper.GenerateAll(item, excludeList); } } return(0); }