【发布时间】:2013-11-24 04:50:23
【问题描述】:
我正在使用 Entity Framework Power Tools Reverse Engineer Code First 从数据库中生成我的 POCO 类、映射文件和上下文。我能够更改 T4 模板以根据我的数据库架构生成不同的命名空间,但我无法找到如何根据表架构创建文件夹并将相关的 POCO 类放在文件夹中。
有人可以帮忙吗? 谢谢
【问题讨论】:
我正在使用 Entity Framework Power Tools Reverse Engineer Code First 从数据库中生成我的 POCO 类、映射文件和上下文。我能够更改 T4 模板以根据我的数据库架构生成不同的命名空间,但我无法找到如何根据表架构创建文件夹并将相关的 POCO 类放在文件夹中。
有人可以帮忙吗? 谢谢
【问题讨论】:
模型(和映射)的文件夹在工具中进行了硬编码。逆向工程 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");
所以,太糟糕了,您无法更改这些文件夹的名称和位置。
【讨论】:
我必须添加另一个答案,因为我已经尝试过我之前建议的方法,但没有奏效。我已更改 EF Power Tools,以便将文件输出到不同的文件夹或项目。
您需要安装以下 EF Power Tools Extension (https://entityframework.codeplex.com/SourceControl/network/forks/khorvat/EFPowerToolsEx)
使用此代码完成导出
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();
有了这个,您将能够将输出导出到另一个文件、文件夹甚至项目。
【讨论】:
更新
正如其他答案中提到的,这种方法不起作用。所以答案不再适用。
您可以尝试解析输出路径并通过执行以下操作创建文件夹:
<#@ 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
【讨论】:
我修改了EFPowerTool extension 以支持基于命名空间的目录结构创建。在 codeplex 的 EF 6.x 项目上创建了 pull request。我还在 github 上创建了一个 experimental branch 用于测试目的。(肯定有修复/增强的空间,可以在发送更新的拉取请求之前添加和测试)
您可以从 here 下载带有建议修复程序的扩展安装程序(请参阅源代码中的安装目录)。
【讨论】: