3

我的客户有一个 db 表命名约定,要求我为所有表添加一个特定于应用程序的前缀 - 例如“myapp_” - 我正在使用 EF4 和模型优先方法。

我可以指定一个自定义 db 命名空间,但他们不想为这个应用程序引入一个新的命名空间——他们的其他应用程序都没有使用 dbo 以外的命名空间。

我走上了自定义 t4 模板的道路,但我无法指定工作流在生成 EF 在运行时需要的 3 个元数据文件时应该使用哪些 t4 模板。

是否有使用 EF 完成表前缀要求的首选方法?

4

2 回答 2

1

您还可以将 Table 属性添加到 SSDL 内容的 EntitySet 中,而不是对 CS 映射和 SSDL 内容进行一些更改。这要容易得多。它变成了这样的东西:

<EntitySet Name="Tests" EntityType="Test.Store.Tests" store:Type="Tables" Schema="dbo" *Table="Prefix_Tests"* />
于 2010-12-02T15:25:30.133 回答
0

我不确定是否有用于生成数据库生成工作流将使用的 edmx 文件的模板,但它肯定会使用一个模板来生成 DDL。位于此路径:
<Program Files>\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen
在此文件夹中查找名为的文件SSDLToSQL10.tt您必须手动复制并粘贴此文件到同一文件夹中,以便 VS2010 识别它,然后您可以修改和自定义它以添加表前缀基于您的数据库命名约定的名称。在 T4 模板中,查找以下代码:

foreach (EntitySet entitySet in Store.GetAllEntitySets())
           {
               string schemaName = Id(entitySet.GetSchemaName());
               string tableName = Id(entitySet.GetTableName());
               ...

您可以更改表名以使用您的自定义前缀。T4 内部有 3 个地方有上述代码,您需要应用前缀。完成后保存并关闭文件并返回到 VS 中的 EDM。现在,当您下拉 DDL Generation Template 属性时,您会看到,您复制和更改的新 T4 文件是一个可用选项。选择它,现在当你从模型生成数据库时,你会发现你的表名有前缀

因此,可以修改模板并自定义 DDL 的构建方式。有一个棘手的问题:工作流不使用修改后的 T4 来更改用于存储和映射定义(SSDL 和 MSL)的 edmx 文件。所以即使数据库已经正确创建,edmx 仍然指向原始表名。

因此,您需要在 XML 编辑器中打开 edmx 并手动更改 CS 映射 (MSL) 和 SSDL 内容以具有您的前缀。为此,您只需更改映射中的StoreEntitySet和 SSDL 内容中的实体集名称。

于 2010-10-15T00:22:25.187 回答