【问题标题】:How to specify different table names than entities in EF4?如何在 EF4 中指定与实体不同的表名?
【发布时间】:2014-04-11 20:21:18
【问题描述】:

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

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

我无法找到在 .edmx 文件中指定此内容的方法。

【问题讨论】:

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


    【解决方案1】:

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

    更改此行为需要更改 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。您需要做的是创建此工作流程的副本并将其放置到同一目录中(您必须为它取一个不同的名称)。您还必须创建一个名为 CSDLToSSDL_TPT.tt 的用于 SSDL 创建的引用 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 脚本。

    【讨论】:

    • 嗨,我完全按照你的建议做了。但是在编辑 T-SQL VIA T4 (TPT).xaml 文件时,我必须更改什么才能在所有生成的表前获得“ab_”前缀?我正在使用您推荐的扩展程序。非常感谢
    • 我相信它应该取自 SSDL 的名称,如果不是,您仍然可以从 SQL 创建中更新模板,但请确保在 SSDL 中使用正确的表名,否则它将无法工作。
    • 你是说我必须用 XML 编辑器打开 EDMX 文件并自己修改 SSDL 部分吗?但是每次我想要重新映射时我都必须这样做,因为它会被覆盖。有没有更好的方法或教程?非常感谢
    • 不应该由已经修改的工作流或模板正确生成该部分,然后它将用于SQL生成。
    • 抱歉,我不确定这是怎么做到的。我如何修改模板来实现这一点?
    【解决方案2】:

    在您的上下文中,您可以覆盖 OnModelCreating(DbModelBuilder modelBuilder) 并执行以下操作:

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

    【讨论】:

      【解决方案3】:

      你可以这样尝试..

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

      1. 使用 XML 编辑器打开 EDMX 文件。
      2. 在其中找到 SSDL 部分。
      3. 定位实体集元素,例如&lt;EntitySet Name="Customers" EntityType="ExampleModel.Store.Customers" Schema="dbo" /&gt;
      4. 添加Table="MyTableName" 属性。 &lt;EntitySet Name="Customers" EntityType="ExampleModel.Store.Customers" Schema="dbo" Table="MyTableName" /&gt;

      这是一个完整的CSDL, SSDL, MSL specification

      希望对您有所帮助。

      取自this link

      【讨论】:

        【解决方案4】:

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

        HTH 洛伦佐

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多