Esempio n. 1
0
        private void GenerateDgml(string processResult, Project project)
        {
            var dgmlBuilder     = new DgmlBuilder.DgmlBuilder();
            var processLauncher = new ProcessLauncher(project);

            var         result = processLauncher.BuildModelResult(processResult);
            ProjectItem item   = null;

            foreach (var info in result)
            {
                var dgmlText = dgmlBuilder.Build(info.Item2, info.Item1, GetTemplate());

                var path = Path.GetTempPath() + info.Item1 + ".dgml";
                File.WriteAllText(path, dgmlText, Encoding.UTF8);
                item = project.ProjectItems.GetItem(Path.GetFileName(path));
                if (item != null)
                {
                    item.Delete();
                }
                item = project.ProjectItems.AddFromFileCopy(path);
            }

            if (item != null)
            {
                var window = item.Open();
                window.Document.Activate();
            }
        }
        public async System.Threading.Tasks.Task GenerateAsync(string outputPath, Project project, GenerationType generationType)
        {
            try
            {
                if (string.IsNullOrEmpty(outputPath))
                {
                    throw new ArgumentException(outputPath, nameof(outputPath));
                }

                if (project.Properties.Item("TargetFrameworkMoniker") == null)
                {
                    EnvDteHelper.ShowError("The selected project type has no TargetFrameworkMoniker");
                    return;
                }

                if (!project.IsNetCore30OrHigher())
                {
                    EnvDteHelper.ShowError("Only .NET Core 3.0+ projects are supported - TargetFrameworkMoniker: " + project.Properties.Item("TargetFrameworkMoniker").Value);
                    return;
                }

                var result = await project.ContainsEfCoreDesignReferenceAsync();

                if (string.IsNullOrEmpty(result.Item2))
                {
                    EnvDteHelper.ShowError("EF Core 3.1 or later not found in project");
                    return;
                }

                if (!result.Item1)
                {
                    if (!Version.TryParse(result.Item2, out Version version))
                    {
                        EnvDteHelper.ShowError($"Cannot support version {result.Item2}, notice that previews have limited supported. You can try to manually install Microsoft.EntityFrameworkCore.Design preview.");
                        return;
                    }
                    var nugetHelper = new NuGetHelper();
                    nugetHelper.InstallPackage("Microsoft.EntityFrameworkCore.Design", project, version);
                    EnvDteHelper.ShowError($"Installing EFCore.Design version {version}, please retry the command");
                    return;
                }

                var processLauncher = new ProcessLauncher(project);

                var processResult = await processLauncher.GetOutputAsync(outputPath, generationType, null);

                if (string.IsNullOrEmpty(processResult))
                {
                    throw new ArgumentException("Unable to collect model information", nameof(processResult));
                }

                if (processResult.StartsWith("Error:"))
                {
                    throw new ArgumentException(processResult, nameof(processResult));
                }

                var modelResult = processLauncher.BuildModelResult(processResult);

                switch (generationType)
                {
                case GenerationType.Dgml:
                    GenerateDgml(modelResult, project);
                    Telemetry.TrackEvent("PowerTools.GenerateModelDgml");
                    break;

                case GenerationType.Ddl:
                    var files = project.GenerateFiles(modelResult, ".sql");
                    foreach (var file in files)
                    {
                        _package.Dte2.ItemOperations.OpenFile(file);
                    }
                    Telemetry.TrackEvent("PowerTools.GenerateSqlCreate");
                    break;

                case GenerationType.DebugView:
                    var views = project.GenerateFiles(modelResult, ".txt");
                    foreach (var file in views)
                    {
                        _package.Dte2.ItemOperations.OpenFile(file);
                    }
                    Telemetry.TrackEvent("PowerTools.GenerateDebugView");
                    break;

                default:
                    break;
                }
            }
            catch (Exception exception)
            {
                _package.LogError(new List <string>(), exception);
            }
        }
        public async System.Threading.Tasks.Task GenerateAsync(string outputPath, Project project, GenerationType generationType)
        {
            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            try
            {
                if (string.IsNullOrEmpty(outputPath))
                {
                    throw new ArgumentException(outputPath, nameof(outputPath));
                }

                if (await project.GetAttributeAsync("TargetFrameworkMoniker") == null)
                {
                    VSHelper.ShowError(SharedLocale.SelectedProjectTypeNoTargetFrameworkMoniker);
                    return;
                }

                if (!await project.IsNetCore31OrHigherAsync())
                {
                    VSHelper.ShowError($"{SharedLocale.SupportedFramework}: {await project.GetAttributeAsync("TargetFrameworkMoniker")}");
                    return;
                }

                var result = await project.ContainsEfCoreDesignReferenceAsync();

                if (string.IsNullOrEmpty(result.Item2))
                {
                    VSHelper.ShowError(SharedLocale.EFCoreVersionNotFound);
                    return;
                }

                if (!Version.TryParse(result.Item2, out Version version))
                {
                    VSHelper.ShowError(string.Format(ModelAnalyzerLocale.CurrentEFCoreVersion, result.Item2));
                }

                if (!result.Item1)
                {
                    var nugetHelper = new NuGetHelper();
                    await nugetHelper.InstallPackageAsync("Microsoft.EntityFrameworkCore.Design", project, version);

                    VSHelper.ShowError(string.Format(SharedLocale.InstallingEfCoreDesignPackage, version));
                    return;
                }

                var processLauncher = new ProcessLauncher(project);

                var processResult = await processLauncher.GetOutputAsync(outputPath, generationType, null);

                if (string.IsNullOrEmpty(processResult))
                {
                    throw new ArgumentException(ModelAnalyzerLocale.UnableToCollectModelInformation, nameof(processResult));
                }

                if (processResult.Contains("Error:"))
                {
                    throw new ArgumentException(processResult, nameof(processResult));
                }

                var modelResult = processLauncher.BuildModelResult(processResult);

                switch (generationType)
                {
                case GenerationType.Dgml:
                    await GenerateDgmlAsync(modelResult, project);

                    Telemetry.TrackEvent("PowerTools.GenerateModelDgml");
                    break;

                case GenerationType.Ddl:
                    var files = project.GenerateFiles(modelResult, ".sql");
                    foreach (var file in files)
                    {
                        await VS.Documents.OpenAsync(file);
                    }
                    Telemetry.TrackEvent("PowerTools.GenerateSqlCreate");
                    break;

                case GenerationType.DebugView:
                    var views = project.GenerateFiles(modelResult, ".txt");
                    foreach (var file in views)
                    {
                        await VS.Documents.OpenAsync(file);
                    }
                    Telemetry.TrackEvent("PowerTools.GenerateDebugView");
                    break;

                default:
                    break;
                }
            }
            catch (Exception exception)
            {
                _package.LogError(new List <string>(), exception);
            }
        }
Esempio n. 4
0
        public void Generate(string outputPath, Project project, GenerationType generationType)
        {
            try
            {
                if (string.IsNullOrEmpty(outputPath))
                {
                    throw new ArgumentException(outputPath, nameof(outputPath));
                }

                if (project.Properties.Item("TargetFrameworkMoniker") == null)
                {
                    EnvDteHelper.ShowError("The selected project type has no TargetFrameworkMoniker");
                    return;
                }

                if (!project.Properties.Item("TargetFrameworkMoniker").Value.ToString().Contains(".NETFramework") &&
                    !project.IsNetCore())
                {
                    EnvDteHelper.ShowError("Currently only .NET Framework and .NET Core 2.0 projects are supported - TargetFrameworkMoniker: " + project.Properties.Item("TargetFrameworkMoniker").Value);
                    return;
                }

                if (project.IsNetCore())
                {
                    var result = project.ContainsEfCoreDesignReference();
                    if (string.IsNullOrEmpty(result.Item2))
                    {
                        EnvDteHelper.ShowError("EF Core 2.1 or 2.2 not found in project");
                        return;
                    }

                    if (!result.Item1)
                    {
                        var version     = new Version(result.Item2);
                        var nugetHelper = new NuGetHelper();
                        nugetHelper.InstallPackage("Microsoft.EntityFrameworkCore.Design", project, version);
                        EnvDteHelper.ShowError($"Installing EFCore.Design version {version}, please retry the command");
                        return;
                    }
                }

                var processLauncher = new ProcessLauncher(project);

                var processResult = processLauncher.GetOutput(outputPath, generationType, null);

                if (processResult.StartsWith("Error:"))
                {
                    throw new ArgumentException(processResult, nameof(processResult));
                }

                var modelResult = processLauncher.BuildModelResult(processResult);

                switch (generationType)
                {
                case GenerationType.Dgml:
                    GenerateDgml(processResult, project);
                    Telemetry.TrackEvent("PowerTools.GenerateModelDgml");
                    break;

                case GenerationType.Ddl:
                    var files = project.GenerateFiles(modelResult, ".sql");
                    foreach (var file in files)
                    {
                        _package.Dte2.ItemOperations.OpenFile(file);
                    }
                    Telemetry.TrackEvent("PowerTools.GenerateSqlCreate");
                    break;

                case GenerationType.DebugView:
                    var views = project.GenerateFiles(modelResult, ".txt");
                    foreach (var file in views)
                    {
                        _package.Dte2.ItemOperations.OpenFile(file);
                    }
                    Telemetry.TrackEvent("PowerTools.GenerateDebugView");
                    break;

                default:
                    break;
                }
            }
            catch (Exception exception)
            {
                _package.LogError(new List <string>(), exception);
            }
        }
Esempio n. 5
0
        public void Generate(string outputPath, Project project, GenerationType generationType)
        {
            try
            {
                if (string.IsNullOrEmpty(outputPath))
                {
                    throw new ArgumentException(outputPath, nameof(outputPath));
                }

                if (project.Properties.Item("TargetFrameworkMoniker") == null)
                {
                    EnvDteHelper.ShowError("The selected project type has no TargetFrameworkMoniker");
                    return;
                }

                if (!project.Properties.Item("TargetFrameworkMoniker").Value.ToString().Contains(".NETFramework") &&
                    !project.IsNetCore())
                {
                    EnvDteHelper.ShowError("Currently only .NET Framework and .NET Core 2.0 projects are supported - TargetFrameworkMoniker: " + project.Properties.Item("TargetFrameworkMoniker").Value);
                    return;
                }

                var processLauncher = new ProcessLauncher(project.IsNetCore(), project.IsNetCore21(), project.IsNetCore22());

                var processResult = processLauncher.GetOutput(outputPath, generationType, null);

                if (processResult.StartsWith("Error:"))
                {
                    throw new ArgumentException(processResult, nameof(processResult));
                }

                var modelResult = processLauncher.BuildModelResult(processResult);

                switch (generationType)
                {
                case GenerationType.Dgml:
                    GenerateDgml(processResult, project);
                    Telemetry.TrackEvent("PowerTools.GenerateModelDgml");
                    break;

                case GenerationType.Ddl:
                    var files = project.GenerateFiles(modelResult, ".sql");
                    foreach (var file in files)
                    {
                        _package.Dte2.ItemOperations.OpenFile(file);
                    }
                    Telemetry.TrackEvent("PowerTools.GenerateSqlCreate");
                    break;

                case GenerationType.DebugView:
                    var views = project.GenerateFiles(modelResult, ".txt");
                    foreach (var file in views)
                    {
                        _package.Dte2.ItemOperations.OpenFile(file);
                    }
                    Telemetry.TrackEvent("PowerTools.GenerateDebugView");
                    break;

                default:
                    break;
                }
            }
            catch (Exception exception)
            {
                _package.LogError(new List <string>(), exception);
            }
        }