private Version GetEntityFrameworkVersion(DbContextPackage package, Project project)
        {
            var vsProject = (VSLangProj.VSProject)project.Object;
            var entityFrameworkReference = vsProject.References.Cast <VSLangProj.Reference>().FirstOrDefault(r => r.Name == "EntityFramework");

            if (entityFrameworkReference == null)
            {
                // Add EF References
                package.LogInfo(Strings.ReverseEngineer_InstallEntityFramework);

                try
                {
                    project.InstallPackage("EntityFramework");
                }
                catch (Exception ex)
                {
                    entityFrameworkReference = vsProject.References.Cast <VSLangProj.Reference>().FirstOrDefault(r => r.Name == "EntityFramework");
                    if (entityFrameworkReference == null)
                    {
                        package.LogError(Strings.ReverseEngineer_InstallEntityFrameworkError, ex);
                        throw new Exception("安装EF出错!");
                    }
                }
            }

            return(new Version(entityFrameworkReference.Version));
        }
        private void OptimizeContextCore(
            LanguageOption languageOption,
            string baseFileName,
            SelectedItem selectedItem,
            Action <string> generateAction)
        {
            DebugCheck.NotEmpty(baseFileName);

            var progressTimer = new Timer {
                Interval = 1000
            };

            try
            {
                var selectedItemPath = (string)selectedItem.ProjectItem.Properties.Item("FullPath").Value;
                var viewsFileName    = baseFileName
                                       + ".Views"
                                       + ((languageOption == LanguageOption.GenerateCSharpCode)
                        ? FileExtensions.CSharp
                        : FileExtensions.VisualBasic);
                var viewsPath = Path.Combine(
                    Path.GetDirectoryName(selectedItemPath),
                    viewsFileName);

                _package.DTE2.SourceControl.CheckOutItemIfNeeded(viewsPath);

                var progress = 1;
                progressTimer.Tick += (sender, e) =>
                {
                    _package.DTE2.StatusBar.Progress(true, string.Empty, progress, 100);
                    progress = progress == 100 ? 1 : progress + 1;
                    _package.LogInfo(Strings.Optimize_Begin(baseFileName));
                };

                progressTimer.Start();

                Task.Factory.StartNew(
                    () =>
                {
                    generateAction(viewsPath);
                })
                .ContinueWith(
                    t =>
                {
                    progressTimer.Stop();
                    _package.DTE2.StatusBar.Progress(false);

                    if (t.IsFaulted)
                    {
                        _package.LogError(Strings.Optimize_Error(baseFileName), t.Exception);

                        return;
                    }

                    selectedItem.ProjectItem.ContainingProject.ProjectItems.AddFromFile(viewsPath);
                    _package.DTE2.ItemOperations.OpenFile(viewsPath);

                    _package.LogInfo(Strings.Optimize_End(baseFileName, Path.GetFileName(viewsPath)));
                },
                    TaskScheduler.FromCurrentSynchronizationContext());
            }
            catch
            {
                progressTimer.Stop();
                _package.DTE2.StatusBar.Progress(false);

                throw;
            }
        }