如何使用EntityModelSchemaGenerator生成少于我的整个模型?

时间:2009-10-07 19:26:15

标签: c# entity-framework edmx

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

由于我们拥有如此庞大的数据库,我们希望不要将所有表都放在同一个模型中。我们完成了所有工作,但生成的模型包含了我们所有的表格。

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

这个工具会使模型不如我们的完整数据库吗?我们可以选择我们想要放哪个表而只使用它们吗?

4 个答案:

答案 0 :(得分:3)

EdmGen2代码附带一个名为/ RetrofitModel的选项。此模式的关键点是运行一些数据挖掘算法,以查看数据库实例中是否存在任何明显的类似继承的关系,如果是,则生成包含这些继承的EDMX。

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

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

它将显示数据库中的表列表,此时您可以检查您希望在模型中使用哪些表。

答案 1 :(得分: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仍会出现。

答案 2 :(得分:0)

我刚给负责EdmGen2的人发了一封电子邮件,让我们看看他带来了什么

亚历克斯詹姆斯

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

答案 3 :(得分:0)

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

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

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