コード例 #1
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";
        }