如何在EF4中指定不同于实体的表名?

时间:2011-11-15 09:36:48

标签: c# .net entity-framework-4 entity-framework-4.1

我的EF4模型中有许多实体,例如ContactsCallsContactTypes等。 当我生成模型的DB时,我得到具有相同命名的表名。

如何使用前缀ab_Contactsab_Calls等设置表名,但是在生成的代码中将实体保留为ContactsCalls

我无法在.edmx文件中找到指定方法。

4 个答案:

答案 0 :(得分:2)

如果您先使用型号,则不需要这样。模型优先用于您对数据库没有要求的场景。

更改此行为需要更改EDMX的SSDL部分的生成过程(一旦您要求设计人员为您生成SQL,就会创建该过程)。默认情况下,此流程由工作流程(%VSINSTALLDIR%\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\TablePerTypeStrategy.xaml)处理,如果您安装Database Generation Power Pack,则可由T4模板处理。您必须修改工作流程(实现一些自定义生成组件)或T4模板才能使用自定义命名约定。

修改

行。我决定自己尝试使答案完整,即使我认为指向正确的方法应该足够了。

安装Database Generation Power Pack时,您将在上述路径中安装一组新的模板和工作流。其中一个工作流程称为Generate T-SQL Via T4 (TPT).xaml。此工作流与原始TablePerTypeStrategy.xaml之间的区别在于,此工作流使用外部T4模板生成SSDL和MSL。您需要做的是创建此工作流的副本并将其放在同一目录中(您必须为其创建一个不同的名称)。您还必须为SSDL创建创建一个名为CSDLToSSDL_TPT.tt的参考T4模板的副本,并将其放在同一目录(具有不同的名称)。获得.tt文件后,打开新的.xaml文件,将SSDL模板的路径更改为新模板(在VS中的设计器或任何文本编辑器中)。作为最后一步,您必须打开.tt文件的副本并更新EntitySet元素创建:

foreach (EntityType entityType in edm.GetAllEntityTypes()) { #>
    <EntitySet Name="<#=WriteEntityTypeName(entityType, edm)#>" EntityType="<#=ssdlModelNamespace#>.<#=WriteEntityTypeName(entityType, edm)#>" Table="prefix_<#=WriteEntityTypeName(entityType, edm)#>" store:Type="Tables" Schema="<#=databaseSchemaName#>" />
<#  } 

我添加了Table属性,其名称指定为prefix_(您可以将其替换为您自己的)。现在,您必须在从模型生成数据库>向导中选择新工作流并创建新的SQL脚本。

答案 1 :(得分:0)

在您的上下文中,您可以覆盖OnModelCreating(DbModelBuilder模型构建器)并执行以下操作:

modelBuilder.Entity<Contact>().ToTable("ab_Contact");

答案 2 :(得分:0)

你可以这样试试..

如果您只需要更改表格的名称,您可以:

  1. 使用XML Editor打开EDMX文件。
  2. 在其中找到SSDL部分。
  3. 找到实例集元素,例如<EntitySet Name="Customers" EntityType="ExampleModel.Store.Customers" Schema="dbo" />
  4. 添加Table="MyTableName"属性。 <EntitySet Name="Customers" EntityType="ExampleModel.Store.Customers" Schema="dbo" Table="MyTableName" />
  5. 这是一个完整的CSDL, SSDL, MSL specification

    希望有所帮助。

    取自this link

答案 3 :(得分:0)

在EF6中,只需更改实体属性

中的实体集名称属性即可

HTH 洛伦佐