1

我们有一个很大的(并且还在增长!)数据库。我们试图不必手动构建模型,我们发现这个 EdmGen2应该为我们构建我们的 EDMX 实体模型。

由于我们有这么大的数据库,我们不希望所有表都在同一个模型中。我们得到了一切工作,但生成的模型包含我们所有的表。

EntityStoreSchemaGenerator 中有一个只读的表列表。它(实际上)是我们所有的桌子。

这个工具会创建一个比我们完整数据库少的模型吗?我们可以选择我们想要放置的表格并只使用那些表格吗?

4

4 回答 4

3

EdmGen2 代码带有一个名为 /RetrofitModel 的选项。这种模式的关键是运行一些数据挖掘算法,看看数据库实例中是否有明显的类继承关系,如果有,生成一个包含这些继承的EDMX。

但是,/RetrofitModel 选项的另一个特性是它允许选择表。例如,如果有 AdventureWorks 示例数据库,您可以发出以下语句:

EdmGen2 /RetrofitModel "Server=(local);Integrated Security=true;Initial Catalog=AdventureWorks;" "System.Data.SqlClient" "AVWorks"

它将显示数据库中的表列表,此时您可以检查要在模型中包含哪些表。

于 2009-10-07T22:39:17.987 回答
1

tupleFraction 参数有助于定义“重要”子类的含义。数据挖掘规则是启发式的,因此它们可以潜在地找到常识可能不同意的模式。

tupleFraction 参数说明了这一点(对于某些规则):如果 EdmGen++ 认为它找到了一个子类,但新子类的 tupleFraction 少于其父类的实例,则认为新子类“无关紧要”并且不要创造它。该参数是可选的 - 如果您不指定它,我认为它被设置为 0.05 (5%)。

当前版本仅允许通过 UI 指定表格。但是,从文件或其他来源中提取表列表很容易添加 - 我会将其添加到下一个版本的待办事项列表的顶部。

更新:我们更新了 code.msdn.microsoft.com/edmgen2 上的代码,以允许在没有 GUI 的情况下指定表。在以前的版本中,RetrofitModel 选项会弹出一个对话框,允许用户选择要包含在模型中的表。ConceptualEdmGen dll 现在有两个额外的公共方法,可以在不打开对话框的情况下设置表格列表 - 一个从文件中提取表格列表,另一个将表格列表作为列表直接提供给方法字符串。

出现在包中的 EdmGen2 代码使用“from file”选项,它在当前目录中查找名为“Tables.txt”的文件,如果找到,将其内容提供给 dll 以设置表列表. 例如,如果以下是“Tables.txt”文件的内容:

HumanResources.Department
HumanResources.Employee
HumanResources.EmployeeAddress
HumanResources.EmployeeDepartmentHistory
HumanResources.JobCandidate
HumanResources.Shift

EdmGen2 将为 AdventureWorks 的 HumanResources 模式中的所有表生成(对于 RetrofitModel 选项)模型。对于这两种方法,一个空列表将导致数据库中的所有表都被添加到模型中。如果没有调用任何表格选择方法,表格选择 UI 仍然会出现。

于 2009-10-12T21:24:49.807 回答
0

我刚刚向负责 EdmGen2 的人发送了一封电子邮件,让我们看看他返回了什么

亚历克斯·詹姆斯

微软实体框架团队项目经理。

于 2009-10-07T19:54:31.460 回答
0

我对此的解决方案是创建一个 EdmGen2 的变体,它读取一个 Filters.txt 文件,其中不仅包含表名,还包含解析为 EntityStoreSchemaFilterEntry 参数(Category、Schema、Name、ObjectType、FilterEffect)的文本。这使我能够生成对特定视图和表进行操作的模型和程序集——我认为 EdmGen2 不会这样做。

当然,这不适用于 ConceptualEdmGen,但由于没有可用的资源,因此我选择不使用该组件。

我还没有解决的一个问题是如何将存储过程的函数定义正确地注入 CSDL 和 MSL。我在 SSDL 中有它,但还不知道如何做其他的。

于 2010-02-24T08:29:32.977 回答