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);
        }
Exemple #2
0
        // 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";
        }