14

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

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

4

4 回答 4

10

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

它通过使用 , 进行表TableFilterExclude过滤TableFilterInclude

过滤器的工作方式如下:

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

例子:

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

给定下表:

  • 一些表
  • 公司
  • company_billing_annual
  • company_billing_ledger
  • 公司报告
  • company_events
  • 另一个表。

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

你剩下:

  • 公司
  • company_events
于 2014-03-11T09:58:34.497 回答
9

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

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

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

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

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

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

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

于 2013-10-04T06:27:00.380 回答
4

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

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

  1. 调整逆向工程模板以忽略所有不需要的表(尽管我个人觉得这很混乱)。如果你想开始了解什么是移动部件,这里有一篇来自 Rowan Miller 的文章 ( http://romiller.com/2012/05/09/customizing-reverse-engineer-code-first-in-the-ef-电动工具/

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

于 2013-10-03T16:07:06.970 回答
3

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

  • 安装 VSIX EF Power 工具后,右键单击解决方案并选择 Entity Framework --> Custom Reverse Engineer Templates。在 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 文件并使用“逆向工程师代码优先”重新生成模型。

于 2016-02-28T12:55:16.217 回答