问题 适用于大量表的实体框架4.1(715)


我正在为拥有700多个表的数据库开发数据访问层。我创建了包含所有表格的模型,这些表格生成了一个巨大的模型。然后我将模型更改为使用4.1中的DBContext,这似乎改进了它的编译和工作方式。设计师似乎根本没有工作。

然后我创建了一个测试应用程序,它只是向表中添加了两条记录,但处理器在db.SaveChanges方法中达到了100%。作为一个黑匣子,很难弄清楚出了什么问题。

所以我的问题是

  1. 实体框架是大型数据库的最佳方法吗?
  2. 如果是这样,应该将模型分解为逻辑区域。我注意到你不能在多个模型中使用相同的sql表
  3. 我已经读过,在这些大型案例中,仅代码方法最好。那是什么。

任何指导都将得到真正的赞赏

谢谢


3419
2018-05-31 10:00


起源



答案:


大型数据库总是很特别。在使用大型数据库时,任何技术都有一些优点和缺点。

您遇到的问题很可能与构建模型有关。当您启动应用程序并首次使用EF相关内容时,EF必须构建模型描述并进行编译 - 这是您在EF中可以找到的最耗时的操作。此操作的复杂性随着模型中实体的数量而增加。编译模型后,它将在应用程序的整个生命周期内重用(如果重新启动应用程序或卸载应用程序域,则必须再次编译模型)。您可以通过预编译模型来避免这种情况。它是在设计时完成的,您可以使用某个工具从模型生成代码,并将该代码包含在项目中(必须在模型中的每次更改后再次执行)。对于基于EDMX的型号,您可以使用 EdmGen.exe 生成视图和您可以使用的基于代码的第一个基础模型 EF Power Tools CTP1

EDMX(设计师)在VS 2010 SP1中进行了改进,以便能够使用大型模型,但我仍然认为在这种情况下,大型是大约100个实体/表。同时,您在同一型号中很少需要715个表。我相信这些715表确实模拟了几个域,因此您可以将它们分成多个模型。

当您首先使用DbContext和代码时也是如此。如果你为一个类建模,你认为当类暴露715属性时它是正确的设计吗?我不这么认为,但这正是你所得到的 DbContext 看起来 - 它为每个公开的实体集都有一个公共属性(在最简单的映射中,它表示每个表有一个属性)。

可以在多个模型中使用相同的实体,但是您应该尽可能地避免它,因为在一个上下文类型中加载实体并在其他上下文类型中使用它时会引入一些复杂性。

仅代码=代码优先=在不使用EDMX的情况下在代码中定义映射时的实体框架。


12
2018-05-31 11:01



除了@Ladislav建议的内容之外,我认为在模块的基础上制作edmx可能有助于在这种情况下,例如管理员有单独的edmx,对于购买模块,另一个edmx类似于其他模块 - Deepesh
我安装了EF Power工具并从现有数据库创建了仅代码模型。这肯定比使用EDMX更好。但是,我仍然有一个问题,即添加记录会将程序发送到lala。我怎么能弄清楚什么是错的? - Phil Salomon
使用EF迁移时,多个上下文会让您遇到麻烦,因为这需要一个数据库==一个上下文,是吗? - Scott Stafford


答案:


大型数据库总是很特别。在使用大型数据库时,任何技术都有一些优点和缺点。

您遇到的问题很可能与构建模型有关。当您启动应用程序并首次使用EF相关内容时,EF必须构建模型描述并进行编译 - 这是您在EF中可以找到的最耗时的操作。此操作的复杂性随着模型中实体的数量而增加。编译模型后,它将在应用程序的整个生命周期内重用(如果重新启动应用程序或卸载应用程序域,则必须再次编译模型)。您可以通过预编译模型来避免这种情况。它是在设计时完成的,您可以使用某个工具从模型生成代码,并将该代码包含在项目中(必须在模型中的每次更改后再次执行)。对于基于EDMX的型号,您可以使用 EdmGen.exe 生成视图和您可以使用的基于代码的第一个基础模型 EF Power Tools CTP1

EDMX(设计师)在VS 2010 SP1中进行了改进,以便能够使用大型模型,但我仍然认为在这种情况下,大型是大约100个实体/表。同时,您在同一型号中很少需要715个表。我相信这些715表确实模拟了几个域,因此您可以将它们分成多个模型。

当您首先使用DbContext和代码时也是如此。如果你为一个类建模,你认为当类暴露715属性时它是正确的设计吗?我不这么认为,但这正是你所得到的 DbContext 看起来 - 它为每个公开的实体集都有一个公共属性(在最简单的映射中,它表示每个表有一个属性)。

可以在多个模型中使用相同的实体,但是您应该尽可能地避免它,因为在一个上下文类型中加载实体并在其他上下文类型中使用它时会引入一些复杂性。

仅代码=代码优先=在不使用EDMX的情况下在代码中定义映射时的实体框架。


12
2018-05-31 11:01



除了@Ladislav建议的内容之外,我认为在模块的基础上制作edmx可能有助于在这种情况下,例如管理员有单独的edmx,对于购买模块,另一个edmx类似于其他模块 - Deepesh
我安装了EF Power工具并从现有数据库创建了仅代码模型。这肯定比使用EDMX更好。但是,我仍然有一个问题,即添加记录会将程序发送到lala。我怎么能弄清楚什么是错的? - Phil Salomon
使用EF迁移时,多个上下文会让您遇到麻烦,因为这需要一个数据库==一个上下文,是吗? - Scott Stafford


看看这篇文章。 http://blogs.msdn.com/b/adonet/archive/2008/11/24/working-with-large-models-in-entity-framework-part-1.aspx


2
2018-06-01 22:46