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