我正在使用Entity Framework Power Tools逆向工程师代码来从数据库生成我的POCO类,映射文件和上下文。我能够根据我的数据库模式更改T4模板以生成不同的命名空间,但是我无法找到如何基于表模式创建文件夹并将相关的POCO类放在文件夹中。
有人可以帮忙吗? 感谢
答案 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,以便将文件输出到不同的文件夹或项目。
您需要安装以下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();
通过这种方式,您可以将输出导出到另一个文件,文件夹甚至项目。
答案 3 :(得分:1)
我修改了EFPowerTool extension以支持基于命名空间的目录结构创建。在codeplex上的EF 6.x项目上创建了一个pull request。此外,我在github上创建了一个experimental branch用于测试目的。(肯定有修复/增强的空间,可以在发送更新的拉取请求之前添加和测试)
您可以使用here中的建议修补程序下载扩展程序安装程序(请参阅源代码中的install dir)。