我的客户端有一个db表命名约定,要求我在所有表前面加上一个特定于应用程序的前缀 - 比如“myapp_” - 我正在使用EF4和模型第一种方法。
我可以指定自定义数据库命名空间,但他们不想为此应用程序引入新的命名空间 - 他们的其他应用程序都不使用除dbo之外的命名空间。
我沿着自定义t4模板的路径走下去,但是在生成EF在运行时需要的3个元数据文件时,我无法指定工作流应该使用哪些t4模板。
是否有使用EF完成表前缀要求的首选方法?
答案 0 :(得分:1)
您可以将Table属性添加到SSDL内容的EntitySet中,而不是对C-S Mapping和SSDL内容进行多处更改。这更容易。它变成了:
<EntitySet Name="Tests" EntityType="Test.Store.Tests" store:Type="Tables" Schema="dbo" *Table="Prefix_Tests"* />
答案 1 :(得分: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生成模板属性时,您将看到复制和更改的新T4文件是可用选项。选择它,现在当您从模型生成数据库时,您会发现您的表名具有前缀
因此,可以修改模板并自定义DDL的构建方式。有一个难点:工作流不使用修改的T4来更改edmx文件以进行存储和映射定义(SSDL和MSL)。因此,即使数据库已正确创建,edmx仍指向原始表名。
因此,您需要在XML编辑器中打开edmx并手动更改C-S映射(MSL)和SSDL内容以获得前缀。为此,您只需要在映射中更改 StoreEntitySet ,在SSDL内容中更改EntitySet的名称。