实体框架Power Tools逆向工程师代码首先进入一个文件夹

时间:2013-11-24 04:50:23

标签: entity-framework entity

我正在使用Entity Framework Power Tools逆向工程师代码来从数据库生成我的POCO类,映射文件和上下文。我能够根据我的数据库模式更改T4模板以生成不同的命名空间,但是我无法找到如何基于表模式创建文件夹并将相关的POCO类放在文件夹中。

有人可以帮忙吗? 感谢

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

<强>更新

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

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

<#@ 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中安装T4工具箱 - http://www.olegsych.com/t4toolbox/http://www.olegsych.com/t4toolbox/gettingstarted/

答案 2 :(得分:1)

我必须添加另一个答案,因为我已尝试过我之前建议的方法,但是没有用。我已经更改了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();
    
  3. 通过这种方式,您可以将输出导出到另一个文件,文件夹甚至项目。

答案 3 :(得分:1)

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

您可以使用here中的建议修补程序下载扩展程序安装程序(请参阅源代码中的install dir)。