gpt4 book ai didi

c# - 分解具有许多关系的大型 DbContext 的方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:55 27 4
gpt4 key购买 nike

我正在处理的一个项目有 DbContext,它跟踪许多不同的实体。由于涉及大量关系,因此在生成 View 时第一次从上下文中查询需要花费很长时间。为了减少启动时间,并将上下文更好地组织到功能区域中,我正在寻找将其分开的方法。

这些是我到目前为止尝试过的一些方法,以及我遇到的问题:

  1. 使用来自巨大 Context 的 DbSet 子集创建一个新的较小 Context。

这无济于事,因为 EF 似乎遍历所有导航属性并包含所有相关实体(至少根据 LINQPad,它在连接面板中展开时显示与上下文相关的所有实体)。我们有一些影响深远的顶级实体,因此很少有子集可以在不删除导航属性和进行大量重构的情况下完全隔离。

  1. 将实体拆分为包含导航属性的类和仅包含数据库字段的类,如下所示:
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; }
}

这里也没有骰子。即使根本没有使用 Person,EF(或者再次,可能只是 LINQPad)包含 Person,尽管它不能被使用。我假设这是因为 EF 支持继承模式,所以它也结束了在这个方向上爬取相关实体。

  1. 与 #2 相同,但在不同项目中使用 PersonLightPerson(或在不同项目中使用 partial 类)。这是目前为止最好的选择,但是最好将 PersonFields 放在 Person 旁边以便于引用。

所以我的问题是:

  • 有没有我想念的更好的方法?
  • 为什么在 #3 中,将它们放在不同的项目中似乎足以将它们分开,以至于 EF 不会尝试同时包含两者?我试过将它们放在不同的命名空间中,但这并没有奏效。

谢谢。

最佳答案

加快速度的选项:

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

顺便说一句,我最初并没有添加此链接,因为您将其标记为 EF6。但以防其他人不在 EF6 上。报告了一些性能改进。更多信息在这里: EF6 Ninja edition

关于c# - 分解具有许多关系的大型 DbContext 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27318266/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com