2013-02-19 76 views
2

我已经搜索,但一直未能找到对此问题的答案。目前,我们的Db用户表的前缀 - 例如向tblUsers。我更新了EF模板以从生成的类名称中删除“tbl”。不过,我仍然无法弄清楚如何改变输出文件的名称来匹配。在EF Power Tools Beta 3中更改生成的文件名称

是否有可能或我要求月亮?我在VS 2012中使用EF Power Tools Beta 3。任何帮助都将非常感谢!

+0

+1我也想这样做。我正在尝试修改模板以删除“tbl”,但要获取所有位置非常困难。你是怎么做到的?添加赏金太多.. – Colin 2013-03-06 17:12:19

+0

@Colin我创建了一个替换正则表达式,需要替换的不仅仅是tbl,在模板根据表名生成类名的所有地方。 例如在新的正则表达式(“(?i)^(tblAA)|(tblBB)|(tblCC)”);' ... 'public DbSet <<#= regEx.Replace (set.ElementType.Name,string.Empty)#>><#= regEx.Replace(set.Name,string.Empty)#> {get;组; }' – Patrick 2013-03-08 13:26:49

+0

我只是在发生前缀时替换“tbl”,所以我只是使用Name.StartsWith(“tbl”)? Name.Substring(3):Name;我其实觉得难以找到“模板根据表名称生成类名的所有地方”。我已经转而使用设计师。您必须手动更改每个名称,方法是双击它并进行编辑,但只需要一次。 – Colin 2013-03-08 14:28:02

回答

3

Patrick,您需要的是修改EF Power Tools使用的T4模板。当您想要在所有映射中创建代码优先,而不是Reverse Engineer Code First选项时,请选择Customize Reverse Engineer Template。你应该得到三个文件:

  1. Context.tt
  2. Entity.tt
  3. Mapping.tt

例如,在Mapping.tt有一条线,从TableSet读取MetadataProperties ,并提取表名。该生产线是这样的:

var tableSet = efHost.TableSet; 
var tableName = (string)tableSet.MetadataProperties["Table"].Value ?? tableSet.Name; 

这就是你需要作出改变,做一些事情,如:

var newTableName = tableName.Replace("tbl", String.Empty); 

当然,你应该选择一个不同的策略,并使用Substring方法或正则表达式阅读并删除前三个字符。之后,您必须通过tt文件并使用您的逻辑,您要使用tableName和用户newTableName变量。您将保留tableName与数据库中的表进行映射的位置,以及您希望将POCO类和文件名用作该名称的newTableName。

对其他两个文件重复该过程。欲了解更多信息,请看Rowan Miller的博客article。这应该给你一个很好的想法如何继续。

+0

我认为这就是我们之前做的(Patrick所做的事情,表名在文件中的多个位置被提取,我放弃了试图追踪它们) - 并且它不会更改输出文件名。 – Colin 2013-03-13 13:50:41

+0

@Husein我能够进行所有更改,但不会更改生成的文件名。 – Patrick 2013-03-13 19:41:45

+0

其实这是真的。我的答案适用于类名和映射类,但输出文件名似乎由'CodeGenerationTools'类控制(您可以在三个.tt文件的顶部看到它)。该类在EF.Utility.CS.ttinclude文件中定义,该文件位于VS2012安装文件夹\ Common7 \ IDE \ Extensions \ Microsoft \ Entity Framework Tools \ Templates \ Includes'中。它实际上是使用类型的Name属性来生成文件名。 – 2013-03-13 21:00:17

相关问题