【问题标题】:Entity Framework Power Tools Reverse Engineer Code First into a folderEntity Framework Power Tools 逆向工程代码首先放入文件夹
【发布时间】:2013-11-24 04:50:23
【问题描述】:

我正在使用 Entity Framework Power Tools Reverse Engineer Code First 从数据库中生成我的 POCO 类、映射文件和上下文。我能够更改 T4 模板以根据我的数据库架构生成不同的命名空间,但我无法找到如何根据表架构创建文件夹并将相关的 POCO 类放在文件夹中。

有人可以帮忙吗? 谢谢

【问题讨论】:

    标签: entity-framework entity


    【解决方案1】:

    模型(和映射)的文件夹在工具中进行了硬编码。逆向工程 EfPowerTools.dll 在 ReverseEngineerCodeFirstHandler 的方法 ReverseEngineerCodeFirst 中显示以下行:

    string str3 = str2 + ".Models";
    string path1_1 = Path.Combine(directory.FullName, "Models");
    string str4 = str3 + ".Mapping";
    string path1_2 = Path.Combine(path1_1, "Mapping");
    

    所以,太糟糕了,您无法更改这些文件夹的名称和位置。

    【讨论】:

      【解决方案2】:

      我必须添加另一个答案,因为我已经尝试过我之前建议的方法,但没有奏效。我已更改 EF Power Tools,以便将文件输出到不同的文件夹或项目。

      1. 您需要安装以下 EF Power Tools Extension (https://entityframework.codeplex.com/SourceControl/network/forks/khorvat/EFPowerToolsEx)

      2. 使用此代码完成导出

        var efHost = (EfTextTemplateHost)Host;
        var code = new CodeGenerationTools(this);   
        var dte = efHost.DTE;
        EnvDTE.Project ModelProject = null;
        
        foreach(EnvDTE.Project dteProject in dte.Solution)
        {
            if (dteProject.Name.Equals("YourModelProjectName"))
                ModelProject = dteProject;
        }
        
        var ModelProjectDirectory = new FileInfo(ModelProject.FullName).Directory;
        var ModelProjectNamespace = (string)ModelProject.Properties.Item("RootNamespace").Value;
        string ModelNameSpace = ModelProjectNamespace + ".Model";
        string outputPath = Path.Combine(ModelProjectDirectory + ModelExportPath + @"Generated\I" + efHost.EntityType.Name + ".cs"); 
        
        Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
        if (ModelProject.DTE.SourceControl.IsItemUnderSCC(outputPath) && !ModelProject.DTE.SourceControl.IsItemCheckedOut(outputPath))
            ModelProject.DTE.SourceControl.CheckOutItem(outputPath);
        File.WriteAllText(outputPath, this.GenerationEnvironment.ToString());
        ModelProject.ProjectItems.AddFromFile(outputPath);
        this.GenerationEnvironment.Clear();
        

      有了这个,您将能够将输出导出到另一个文件、文件夹甚至项目。

      【讨论】:

      • 我在尝试运行它时遇到错误:1)“M​​icrosoft.DbContextPackage.Utilities.EfTextTemplateHost”不包含“DTE”的定义和 2)名称“ModelExportPath”不存在在当前情况下。我基本上复制并粘贴了原始 var efHost = (EFTextTemplateHost)Host 行所在的所有内容。
      • 你使用的是哪个 EF 版本?
      • 我相信最新的 6.3.1 和 VS 2013
      • 看起来@khorvat 的更改并未适用于 EF Power 工具版本 Beta 4。是的,这些(模型、映射)目录在处理程序中是硬编码的。因此,要么您必须手动更改代码并重新编译 ddl 以使其正常工作,要么您自己移动文件。
      【解决方案3】:

      更新

      正如其他答案中提到的,这种方法不起作用。所以答案不再适用。

      您可以尝试解析输出路径并通过执行以下操作创建文件夹:

      <#@ import namespace="System.IO" #>
      
      var efHost = (EfTextTemplateHost)Host;
      var outputPath = Path.Combine(Path.GetDirectoryName(efHost.TemplateFile), "YourFolder");
      
      if (!Directory.Exists(outputPath))         
        Directory.CreateDirectory(outputPath);
      

      现在要输出到不同的文件夹,您可以尝试使用类似于此的 GenerationEnvironment

      <#@ dte processor="T4Toolbox.DteProcessor" #>
      <#@ TransformationContext processor="T4Toolbox.TransformationContextProcessor" #>
      <#@ assembly name="System.Xml" #>
      <#@ assembly name="EnvDTE" #>
      <#@ import namespace="T4Toolbox" #>
      
      ProcessOutputTemplate template = new ProcessOutputTemplate(this.GenerationEnvironment.ToString());
      template.Output.File = outputPath;
      template.Render();
      this.GenerationEnvironment.Clear();
      

      注意:此方法需要在 VS 2012/13 - http://www.olegsych.com/t4toolbox/ (http://www.olegsych.com/t4toolbox/gettingstarted/) 中安装 T4 Toolbox

      【讨论】:

        【解决方案4】:

        我修改了EFPowerTool extension 以支持基于命名空间的目录结构创建。在 codeplex 的 EF 6.x 项目上创建了 pull request。我还在 github 上创建了一个 experimental branch 用于测试目的。(肯定有修复/增强的空间,可以在发送更新的拉取请求之前添加和测试

        您可以从 here 下载带有建议修复程序的扩展安装程序(请参阅源代码中的安装目录)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-22
          • 1970-01-01
          相关资源
          最近更新 更多