Example #1
0
        private async void btnGenerate_Click(object sender, EventArgs e)
        {
            try {
                ProjectItem lastItem = null;
                if (!txtSavePath.Text.IsNullOrWhiteSpace())
                {
                    lastItem = this.selectedProject.ProjectDte.AddFolderToProject(txtSavePath.Text);
                }

                var saveDir = Path.Combine(selectedProject.ProjectDirectoryName, txtSavePath.Text);
                if (!Directory.Exists(saveDir))
                {
                    Directory.CreateDirectory(saveDir);
                }


                //放个临时文件夹 再用AddFileFromCopy的方式 添加到项目中,增加了IO操作
                //实在没找到用什么方法可以直接添加一个现有的文件

                string generatorTempDir    = Path.Combine(Constant.BasePath, "generate_temp");
                bool   shouldDeleteTempDir = false;
                if (!Directory.Exists(generatorTempDir))
                {
                    shouldDeleteTempDir = true;
                    Directory.CreateDirectory(generatorTempDir);
                }

                List <TableInfo> checkedTables = new List <TableInfo>();
                foreach (var item in cbxlTables.CheckedItems)
                {
                    var table = all.Tables.FirstOrDefault(r => r.Name.EqualsIgnoreCase(item.ToString()));
                    if (table != null)
                    {
                        checkedTables.Add(table);
                    }
                }

                #region 实体类创建

                var    generator = Factory.Generator();
                string path      = txtSavePath.Text.Split(new[] { "/", "\\" }, StringSplitOptions.RemoveEmptyEntries)?.Join(".");
                foreach (var table in checkedTables)
                {
                    await ShowBuildMsgAsync($"开始为您创建实体:\"{table.Name}.cs\"");

                    //这里无需等待
                    await Task.Run(async() => {
                        try {
                            string classContent = generator.GenerateEntity(table, all, selectedProject.ProjectName, path);
                            var fileFullName    = Path.Combine(saveDir, table.Name + ".cs");

                            if (!File.Exists(fileFullName))
                            {
                                var fileTempFullName = Path.Combine(generatorTempDir, table.Name + ".cs");

                                File.WriteAllText(fileTempFullName, classContent, Encoding.UTF8);
                                if (lastItem != null)
                                {
                                    lastItem.AddFilesToProject(fileTempFullName);
                                }
                                else
                                {
                                    this.selectedProject.ProjectDte.AddFilesToProject(fileTempFullName);
                                }
                                selectedProject.ProjectDte.Save();

                                File.Delete(fileTempFullName);
                            }
                            else
                            {
                                File.WriteAllText(fileFullName, classContent, Encoding.UTF8);
                            }

                            await ShowBuildMsgAsync($"实体文件[{table.Name}.cs]创建完成");
                        }
                        catch (Exception ex) {
                            await ShowBuildMsgAsync($"创建实体文件[{table.Name}.cs]出现错误:{JsonHelper.ToJson(ex)}");
                        }
                    });
                }

                #endregion


                #region dbcontext创建

                if (cbxGenerateContext.Checked)
                {
                    string contextName = txtContextPrefix.Text + "DbContext";

                    string contextClassContent = generator.GenrateContext(checkedTables, contextName, selectedProject.ProjectName, path);
                    try {
                        var fileFullName = Path.Combine(saveDir, contextName + ".cs");
                        await ShowBuildMsgAsync($"正在为您创建:\"{contextName}.cs\"");

                        if (!File.Exists(fileFullName))
                        {
                            var fileTempFullName = Path.Combine(generatorTempDir, contextName + ".cs");

                            File.WriteAllText(fileTempFullName, contextClassContent, Encoding.UTF8);

                            if (lastItem != null)
                            {
                                lastItem.AddFilesToProject(fileTempFullName);
                            }
                            else
                            {
                                this.selectedProject.ProjectDte.AddFilesToProject(fileTempFullName);
                            }
                            selectedProject.ProjectDte.Save();

                            File.Delete(fileTempFullName);
                        }
                        else
                        {
                            File.WriteAllText(fileFullName, contextClassContent, Encoding.UTF8);
                        }
                    }
                    catch (Exception ex) {
                        await ShowBuildMsgAsync($"创建DbContext文件[{contextName}.cs]出现错误:{JsonHelper.ToJson(ex)}");
                    }
                }

                #endregion

                if (shouldDeleteTempDir)
                {
                    Directory.Delete(generatorTempDir, true);
                }
                LastDataConfiguration.Instance.Set("SavePath", txtSavePath.Text);
                LastDataConfiguration.Instance.Set("ContextPrefix", txtContextPrefix.Text);
                LastDataConfiguration.Instance.Set("IsGenerateContext", cbxGenerateContext.Checked ? "true" : "false");
                LastDataConfiguration.Instance.Save();

                await ShowBuildMsgAsync("已为您创建完成!");
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }