【发布时间】:2013-10-10 03:14:34
【问题描述】:
我正在使用 EF,并且拥有 Entity Framework Power Tools 扩展,它允许我基于给定数据库中的表对类进行反向工程。
我们有一个相当广泛的数据库,其中有很多我不需要表示的表。有什么简单的方法可以选择其中的一个子集,然后只对那些进行逆向工程吗?
【问题讨论】:
标签: entity-framework visual-studio-2012 ef-code-first reverse-engineering
我正在使用 EF,并且拥有 Entity Framework Power Tools 扩展,它允许我基于给定数据库中的表对类进行反向工程。
我们有一个相当广泛的数据库,其中有很多我不需要表示的表。有什么简单的方法可以选择其中的一个子集,然后只对那些进行逆向工程吗?
【问题讨论】:
标签: entity-framework visual-studio-2012 ef-code-first reverse-engineering
截至目前,EF Power Tools 无法直接排除表格。他们说这个功能请求已经在积压中,但不清楚它是否会进入 RTM。
我已经看到了解决此问题的两种主要方法:
调整逆向工程模板以忽略所有不需要的表(尽管我个人觉得这很混乱)。如果您想了解哪些是活动部件,请查看 Rowan Miller (http://romiller.com/2012/05/09/customizing-reverse-engineer-code-first-in-the-ef-power-tools/) 的一篇文章
创建一个只包含您感兴趣的表的虚拟数据库,然后让逆向工程发挥它的魔力。另一种方法是拥有一个“特殊的数据库用户”,它只能访问相关的表并在连接时使用它。
【讨论】:
我找到了一个可行的解决方案,尽管它需要几个“额外”步骤:
在项目中,右键选择Add > new Item。选择左侧的Data,然后从项目列表中选择ADO.NET Entity Data Model。
从现在显示的对话框/向导中,您可以选择要从中生成模型的数据库,在这种情况下,您可以只选择您需要的表、视图以及存储过程和函数。
添加模型后,可以在解决方案资源管理器中展开,在YourModelName.edmx下应该能找到你需要的类 --> YourModelName.tt
注意:您将无法拖放源文件,但您可以右键单击并选择copy class。然后,您可以将它们粘贴到您需要它们的位置,它们会在名称后面附加一个"1"。因此,您需要进行一些简单的重构(更改文件名、类名和命名空间),但这仍然相当简单。
现在您可以删除原始模型(edmx-文件)及其下的所有内容。
这不是一个完美的解决方案,但它仍然比生成大量表格表示并等待 VS 完成工作要容易,特别是如果你有很多不必要的表格、视图、等等。
【讨论】:
如果您的数据库是 SQL Server 或 SQL Server CE 4.0,那么您可以使用visualstudiogallery.msdn.microsoft.com 提供的“实体框架反向 POCO 生成器”
它通过使用TableFilterExclude、TableFilterInclude进行表过滤。
过滤器的工作方式如下:
例子:
TableFilterExclude = new Regex("billing|report");
TableFilterInclude = new Regex("company");
给定以下表格:
名称中包含帐单或报告的任何表格都会立即被排除在外。 包含名称中带有公司的任何表。
剩下的就是:
【讨论】:
一个有答案的老问题,但它是谷歌搜索中唯一出现的问题,所以我想我会发布我的解决方案 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 文件并使用“逆向工程师代码优先”重新生成模型。
【讨论】: