【问题标题】:Reverse engineering a subset of tables for Entity Framework对实体框架的表子集进行逆向工程
【发布时间】:2013-10-10 03:14:34
【问题描述】:

我正在使用 EF,并且拥有 Entity Framework Power Tools 扩展,它允许我基于给定数据库中的表对类进行反向工程。

我们有一个相当广泛的数据库,其中有很多我不需要表示的表。有什么简单的方法可以选择其中的一个子集,然后只对那些进行逆向工程吗?

【问题讨论】:

    标签: entity-framework visual-studio-2012 ef-code-first reverse-engineering


    【解决方案1】:

    截至目前,EF Power Tools 无法直接排除表格。他们说这个功能请求已经在积压中,但不清楚它是否会进入 RTM。

    我已经看到了解决此问题的两种主要方法:

    1. 调整逆向工程模板以忽略所有不需要的表(尽管我个人觉得这很混乱)。如果您想了解哪些是活动部件,请查看 Rowan Miller (http://romiller.com/2012/05/09/customizing-reverse-engineer-code-first-in-the-ef-power-tools/) 的一篇文章

    2. 创建一个只包含您感兴趣的表的虚拟数据库,然后让逆向工程发挥它的魔力。另一种方法是拥有一个“特殊的数据库用户”,它只能访问相关的表并在连接时使用它。

    【讨论】:

    • 感谢您的提示,不胜感激!有趣的想法,尤其是“特殊用户”的概念——好主意!我找到了一个解决我的问题的解决方案;查看自己的答案。
    • now 用于新的 EF(请参阅此页面上的答案)。
    【解决方案2】:

    我找到了一个可行的解决方案,尽管它需要几个“额外”步骤:

    在项目中,右键选择Add > new Item。选择左侧的Data,然后从项目列表中选择ADO.NET Entity Data Model

    从现在显示的对话框/向导中,您可以选择要从中生成模型的数据库,在这种情况下,您可以只选择您需要的表、视图以及存储过程和函数。

    添加模型后,可以在解决方案资源管理器中展开,在YourModelName.edmx下应该能找到你需要的类 --> YourModelName.tt

    注意:您将无法拖放源文件,但您可以右键单击并选择copy class。然后,您可以将它们粘贴到您需要它们的位置,它们会在名称后面附加一个"1"。因此,您需要进行一些简单的重构(更改文件名、类名和命名空间),但这仍然相当简单。

    现在您可以删除原始模型(edmx-文件)及其下的所有内容。

    这不是一个完美的解决方案,但它仍然比生成大量表格表示并等待 VS 完成工作要容易,特别是如果你有很多不必要的表格、视图、等等。

    【讨论】:

    • 这真的很“震撼”——以一种很好的方式。请记住,如果您想要 EF 逆向工程体验,请在实体数据模型向导出现时选择“数据库中的代码”。
    • 为什么这是答案?这不是“实体框架电动工具”,它使用 edmx
    【解决方案3】:

    如果您的数据库是 SQL Server 或 SQL Server CE 4.0,那么您可以使用visualstudiogallery.msdn.microsoft.com 提供的“实体框架反向 POCO 生成器”

    它通过使用TableFilterExcludeTableFilterInclude进行表过滤。

    过滤器的工作方式如下:

    1. 读取架构
    2. 删除与排除过滤器匹配的所有表(如果存在)。
    3. 包括与包含过滤器匹配的所有表(如果存在)。

    例子:

    TableFilterExclude = new Regex("billing|report");
    TableFilterInclude = new Regex("company");
    

    给定以下表格:

    • some_table
    • 公司
    • company_billing_annual
    • company_billing_ledger
    • company_reports
    • company_events
    • 另一个表。

    名称中包含帐单或报告的任何表格都会立即被排除在外。 包含名称中带有公司的任何表。

    剩下的就是:

    • 公司
    • company_events

    【讨论】:

    • 您的模板比电动工具要好得多。我用电动工具生成了 1000 个表格,这就像一个小时,你的工具有很多定制,繁荣......
    【解决方案4】:

    一个有答案的老问题,但它是谷歌搜索中唯一出现的问题,所以我想我会发布我的解决方案 Entity Framework Power Tools 过滤表的子集。

    • 安装 VSIX EF Power 工具后,继续右键单击解决方案并选择实体框架 --> 自定义逆向工程师模板。在Sln-root/CodeTemplates/ReverseEngineerCodeFirst下会生成几个.tt文件,分别打开。

    • Context.tt - 在第 27 行找到 foreach 循环,并将用于过滤的代码粘贴到 foreach 循环内:

      // START Filter for specific tables only
      string[] filterTables = new string[] { "Motorcycle", "Person" };
      if (!filterTables.Contains(set.ElementType.Name.ToString()))
      {
          continue;   
      }
      // END Filter for specific tables only
      

    这将避免为您的 filterTables 数组中未指定的表生成 public DbSet< 行。

    在 foreach 循环内的第 38 行粘贴与上面相同的代码。这将避免生成modelBuilder.Configurations.Add

    • Entity.tt - 找到第 6 行并粘贴代码,该代码将为不在 filterTables 数组中的表返回空并转义生成文件:

      // START Filter for specific tables only
      string[] filterTables = new string[] { "Motorcycle", "Person" };
      if (!filterTables.Contains(efHost.EntityType.Name.ToString()))
      {
          return "";  
      }
      // END Filter for specific tables only
      
    • Mapping.tt - 找到第 14 行并粘贴与上面相同的代码:

      // START Filter for specific tables only
      string[] filterTables = new string[] { "Motorcycle", "Person" };
      if (!filterTables.Contains(efHost.EntityType.Name.ToString()))
      {
          return "";  
      }
      // END Filter for specific tables only
      
    • 保存所有 .tt 文件并使用“逆向工程师代码优先”重新生成模型。

    【讨论】:

    • 非常感谢。我一直在寻找这样一个简洁的答案。
    猜你喜欢
    • 2017-04-08
    • 2015-08-05
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多