Model.tt T4在没有设置外部类型时不生成自定义枚举文件

时间:2015-03-13 15:24:45

标签: entity-framework entity-framework-6 t4 ef-database-first

我有一个Model.edmx文件,我添加了一个自定义枚举类型(通过"转换为枚举"或"添加枚举类型")。让我们称之为枚举" MyEnum"

我在这个枚举中添加了一些成员:

  • MyMemberOne
  • MyMemberTwo
  • MyMemberThree

错误地,我检查Reference external type并将其设置为某个内容,让我们说MyExternalEnum,并保存edmx。

然后我意识到这不是我想要的,所以我编辑枚举(右键单击&gt;编辑)并取消选中Reference external type,点击OK然后重新保存。< / EM>

当我执行自动生成的Model.tt(右键单击&gt;运行自定义工具)时,我希望创建一个文件MyEnum.cs

情况并非如此

仔细检查是否取消选中Reference external type不会产生任何结果。

为什么?什么是hapenning?

1 个答案:

答案 0 :(得分:0)

我在xml文本编辑器中浏览了Model.edmx,并看到MyEnum被编码为:

    <EnumType Name="MyEnum" a:ExternalTypeName="" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration" >
      <Member Name="MyMemberOne" />
      <Member Name="MyMemberTwo" />
      <Member Name="MyMemberThree" />
    </EnumType>

这个应该可以,因为ExternalTypeName为空,但由于某种原因,Model.tt T4文件生成器将空字符串视为实际值,从而阻止枚举代码生成。 从EnumType标记中删除a:ExternalTypeName="" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration"并保存允许Model.tt正确生成文件MyEnum.cs。

    <EnumType Name="MyEnum"> <!-- This is ok -->
      <Member Name="MyMemberOne" />
      <Member Name="MyMemberTwo" />
      <Member Name="MyMemberThree" />
    </EnumType>

我在Model.tt中没有看到任何暗示这种行为存在的原因,也没有预期(但我非常怀疑它......)。

我希望那里的某个地方有if (ExternalTypeName != null) //Do not generate file而不是if (ExternalTypeName != null && ExternalTypeName != String.Empty),但实际的错误并不容易发现。