public static List <Column> GetColumnsByTableId( DataTable syscolumns, DataTable systypes, DataTable defaultConstraints, int id, string tableName) { var columns = new List <Column>(); var skipList = TemplateConstants.FieldsToSkip .Split(',') .Select(a => a.Trim().ToLower()) .ToList(); var selectedColumns = syscolumns.Select( "object_id = " + id, "column_id asc") .Where(a => skipList .All(s => tableName.ToLower() + "." + a["name"].ToString().ToLower() != s)) .ToList(); selectedColumns .ToList() .ForEach(a => { var type = GetTypeByUserTypeId( systypes, (int)a["user_type_id"]); var column = new Column { ClrType = TableGenerator.GetClrType(type), GeneratedName = NamingUtil.GetColumnName(tableName, a["name"].ToString()), IsComputed = Convert.ToBoolean(a["is_computed"]), IsIdentity = Convert.ToBoolean(a["is_identity"]), IsNullable = Convert.ToBoolean(a["is_nullable"]), DefaultValue = a["default_object_id"].ToString() != "0" ? defaultConstraints .Select( "object_id = " + a["default_object_id"].ToString()) .Select(dc => dc["definition"].ToString()) .SingleOrDefault() : null, Length = Convert.ToInt32(a["max_length"]), Name = a["name"].ToString(), Precision = Convert.ToInt32(a["precision"]), Scale = Convert.ToInt32(a["scale"]), Type = type }; if (column.DefaultValue != null && DefaultValuesToBeExcluded.ContainsKey(column.DefaultValue.ToLower())) { column.DefaultValue = null; } if (column.DefaultValue != null) { column.DefaultValue = Regex.Replace(column.DefaultValue, @"[\(\)]", ""); column.DefaultValue = Regex.Replace(column.DefaultValue, @"\'", "\""); column.DefaultValue = column.DefaultValue.Trim(); switch (column.ClrType) { case "bool": column.DefaultValue = column.DefaultValue == "1" ? "true" : "false"; break; case "Guid": column.DefaultValue = "Guid.NewGuid()"; break; case "DateTime" when column.DefaultValue.ToLower() == "getutcdate": column.DefaultValue = "DateTime.UtcNow"; break; case "DateTime": column.DefaultValue = "DateTime.Parse(" + column.DefaultValue + ")"; break; // ReSharper disable once RedundantEmptySwitchSection default: break; } } columns.Add(column); }); return(columns); }
// ReSharper disable once UnusedMember.Global public static void Run(IServiceProvider host) { var statusBar = VsUtil.GetStatusBar(host); statusBar.Text = "Getting solution..."; var solution = VsUtil.GetSolution(host); // ConnectionString statusBar.Text = "Getting connection string project..."; var connectionStringProject = VsUtil.GetProjectBySolutionPath( solution, TemplateConstants.ConnectionStringProject); statusBar.Text = "Computing connection string path..."; var connectionStringPath = Path.Combine( Path.GetDirectoryName(connectionStringProject.FileName) ?? throw new InvalidOperationException(), TemplateConstants.ConnectionStringProjectRelativePath); statusBar.Text = "Getting connection string..."; var connectionStringConfigPath = Path.Combine(connectionStringPath, TemplateConstants.ConnectionStringFileName); var connStr = VsUtil.GetAppSetting( connectionStringConfigPath, TemplateConstants.ConnectionStringAppSetting); // DAL statusBar.Text = "Getting DbContext project..."; var dbContextProject = VsUtil.GetProjectBySolutionPath( solution, TemplateConstants.DbContextProject); statusBar.Text = "Computing DbContext path..."; var dbContextPath = Path.Combine( Path.GetDirectoryName(dbContextProject.FileName) ?? throw new InvalidOperationException(), TemplateConstants.DbContextProjectRelativePath, TemplateConstants.DbContextClassName + ".cs"); // Models statusBar.Text = "Getting models project..."; var modelsProject = VsUtil.GetProjectBySolutionPath( solution, TemplateConstants.ModelsProject); statusBar.Text = "Computing models path..."; var modelsPath = Path.Combine( Path.GetDirectoryName(modelsProject.FileName) ?? throw new InvalidOperationException(), TemplateConstants.ModelsProjectRelativePath); statusBar.Text = "Getting schema dataset..."; var ds = DbUtil.GetSchemaDataSet(connStr); statusBar.Text = "Modeling table objects..."; var tables = TableGenerator.GenerateAll(ds) .OrderBy(a => a.GeneratedName) .ToList(); // DAL (DbContext) statusBar.Text = "Creating DbContext class..."; var content = DbContextGenerator.Generate( TemplateConstants.DbContextClassName, TemplateConstants.DbContextNamespace, TemplateConstants.ModelsNamespaceDbContext, tables); var path = dbContextPath; File.WriteAllText(path, content); dbContextProject.ProjectItems.AddFromFile(path); // Models foreach (ProjectItem projectItem in modelsProject.ProjectItems) { var fileName = projectItem.FileNames[0]; var dirName = Path.GetDirectoryName(fileName); if (dirName != modelsPath) { continue; } foreach (ProjectItem modelsDbItem in projectItem.ProjectItems) { var modelsDbItemFileName = modelsDbItem.FileNames[0]; var modelsDbItemKind = modelsDbItem.Kind; var modelsDbItemName = modelsDbItem.Name; if (modelsDbItemKind != "{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}" || !modelsDbItemFileName .EndsWith( $"{TemplateConstants.EntitySuffix}.cs")) { continue; } statusBar.Text = $"Deleting {modelsDbItemName}"; modelsDbItem.Remove(); File.Delete(modelsDbItemFileName); } } var tableCount = tables.Count; var index = 1; tables .ForEach(a => { var percent = index * 100 / tableCount; statusBar.Text = "Creating class file for table " + a.TableName + ", " + index + " of " + tableCount + ", " + percent + "%..."; content = TableGenerator.GenerateTableClassFileContent(a, TemplateConstants.ModelsNamespace); path = Path.Combine(modelsPath, a.GeneratedName + ".cs"); File.WriteAllText(path, content); modelsProject.ProjectItems.AddFromFile(path); index++; }); statusBar.Text = "Generation complete"; }