拆分具有许多关系的大型DbContext的方法

时间:2014-12-05 14:38:44

标签: c# entity-framework entity-framework-6 linqpad

我正在研究的项目有DbContext,可以跟踪很多不同的实体。由于涉及大量关系,在生成其视图时第一次从上下文查询需要很长时间。为了减少启动时间,并更好地将环境组织到功能区域,我正在寻找将它分开的方法。

这些是我迄今为止尝试过的一些方法,以及我与他们见过的问题:

  1. 使用庞大的Context中的DbSets子集创建一个新的较小的Context。
  2. 这没有任何帮助,因为EF似乎遍历所有导航属性并且包括所有相关实体(至少根据LINQPad,它显示了与Context相关的所有实体)在连接面板中)。我们有一些具有深远意义的顶级实体,因此很少有子集可以完全隔离而无需删除导航属性并进行大量重构。

    1. 将实体拆分为包含导航属性的类,以及仅包含db字段的类,如下所示:
    2. public class PersonLight
      {
          public int Id { get; set; }
          public string Name { get; set; }
          public int JobId { get; set; }
      }
      
      public class Person : PersonLight
      {
          public Job Job { get; set; }
      }
      
      public class ContextLight : DbContext
      {
          public virtual DbSet<PersonLight> People { get; set; }
      }
      

      这里也没有骰子。即使人员根本没有被使用,但EF(或者可能只是LINQPad)包括Person,尽管它不能被使用。我认为这是因为EF支持继承模式,因此它也会在这个方向上结束对相关实体的爬行。

      1. 与#2相同,但在不同项目中使用PersonLightPerson(或在不同项目中使用partial类)。这是目前为止的最佳选择,但如果PersonFields旁边有Person以便于参考,那就太棒了。
      2. 所以我的问题是:

        • 有没有更好的方法可以解决这个问题?
        • 为什么在#3中,将它们放在不同的项目中似乎将它们分开,以至于EF不会尝试包含它们?我已经尝试将它们放在不同的命名空间中,但这并不能解决问题。

        感谢。

1 个答案:

答案 0 :(得分:1)

加速发展的选项:

具有讽刺意味的是,IIS应用程序池只需要生成一次视图。 基于我的测试的命令行,每次都生成视图。 不确定linqpad是做什么的。

BTW我之前没有添加此链接,因为您标记了EF6。 但是如果其他人不在EF6上。报告了一些性能改进。更多信息: EF6 Ninja edition