使用逆向工程技术为Entity Framework生成一部分表的代码

15
我正在使用EF,并且安装了Entity Framework Power Tools扩展程序,它可以让我基于给定数据库中的表格反向工程化生成类。我们有一个非常庞大的数据库,其中有很多表格我不需要表示。是否有任何简单的方法可以选择这些数据表的子集,仅反向工程化生成所需的部分?
4个回答

10

如果您的数据库是SQL Server或SQL Server CE 4.0,则可以使用“Entity Framework Reverse POCO Generator”,该工具可在visualstudiogallery.msdn.microsoft.com上获取。

它可以通过使用TableFilterExcludeTableFilterInclude来进行表过滤。

过滤器的工作方式如下:

  1. 读取模式
  2. 删除任何与排除过滤器匹配的表(如果存在)。
  3. 包括与包含过滤器匹配的任何表(如果存在)。

例如:

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

给定以下表格:

  • some_table
  • company
  • company_billing_annual
  • company_billing_ledger
  • company_reports
  • company_events
  • another_table.

任何名称中包含billing或report的表都将被立即排除。 任何名称中包含company的表都将被包括在内。

最终筛选结果为:

  • company
  • company_events

1
你的模板比强大的工具好多了。我用压力工具生成了1000张表格,花费了一个小时,但是使用你的工具进行大量自定义后,嘭……不到1分钟就完成了。向你致敬,干得好! - SSA

9

我找到了一个解决方案,它可以工作,但需要几个“额外”的步骤:

在项目中,右键单击并选择添加 > 新项。在左侧选择数据,然后从项目列表中选择ADO.NET实体数据模型

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

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

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

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

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


这真的很棒 - 以一种好的方式。记住,如果你想要一个EF反向工程体验,请在实体数据模型向导出现时选择“从数据库生成代码”。 - JosephDoggie
为什么这是答案?这不是“Entity Framework Power Tools”,而是使用edmx。 - khoailang

4
目前,使用EF Power Tools无法直接排除表。他们表示这个功能请求已经在待办事项列表中,但不清楚它是否会被纳入RTM。
我看到了两种主要的解决方法:
1. 调整反向工程模板以忽略所有不需要的表格(尽管我个人认为这很混乱)。如果您想开始了解移动部件,请参阅Rowan Miller的文章(http://romiller.com/2012/05/09/customizing-reverse-engineer-code-first-in-the-ef-power-tools/
2. 创建一个只包含您感兴趣的表格的虚拟数据库,并让反向工程自动运行。另一种选择是创建一个“特殊的数据库用户”,该用户只能访问相关表格并在连接时使用它。

谢谢你的建议,非常感激!有趣的想法,特别是“特殊用户”概念-好主意!不过我已经找到了解决我的问题的方法;请看我的回答。 - Kjartan
现在有新的EF(请参见此页面上的答案)。 - JosephDoggie

3

这是一个老问题,可能已经有了答案,但在谷歌搜索中只得到了这个,所以我想分享我的解决方案——如何使用Entity Framework Power Tools过滤一些表。

  • After installing VSIX EF Power tools go ahead and right click a solution and select Entity Framework --> Custom Reverse Engineer Templates. A few .tt files will be generated under Sln-root/CodeTemplates/ReverseEngineerCodeFirst, open each one of them.

  • Context.tt - find the foreach loop at line 27 and paste code for filtering inside of the foreach loop:

    // 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
    

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

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

  • Entity.tt - find line 6 and paste code which will return empty and escape generating file for tables not in filterTables array:

    // 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 - find line 14 and paste the same code as above:

    // 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
    
  • Save all .tt files and regenerate the model with "Reverse Engineer Code First".


非常感谢。我已经寻找像这样简明的答案有一段时间了。 - user906573

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接