【问题标题】:How can I stop an auto-generated Linq to SQL class from loading ALL data?如何阻止自动生成的 Linq to SQL 类加载所有数据?
【发布时间】:2010-03-12 14:39:12
【问题描述】:

更新:据我所知,我正在想象我在下面描述的问题。所以,这几乎不是问题。未来的读者,继续……这里没什么可看的。


我有一个 ASP.NET MVC 项目,很像 NerdDinner 教程示例。 (我使用的是 MVC 2,但遵循了 NerdDinner 教程来创建它)。

按照教程part 3 中的说明,我通过创建“Linq to SQL 类”(.dbml) 表面并将我的数据库表放到它。设计器已经根据我的数据库表自动添加了生成的类之间的关系。

假设我的课程与 NerdDinner 示例相同,因此我有 Dinner 和 RSVP 表,其中每个 Dinner 记录与许多 RSVP 记录相关联 - 因此在生成的类中,Dinner 对象具有 RSVPs 属性,它是RSVP 对象列表。

我的问题是这样的:一旦我 访问一个 Dinner 对象,它会加载所有相应的 RSVP 对象,即使我不使用 RSVPs 成员。

第一个问题:这真的是生成类的默认行为吗?

在我的特定情况下,对象图包含更多的表(其中的记录要多一个数量级),因此这是灾难性的行为 - 当我只想显示单个父记录的详细信息。

第二个问题:是否有任何通过设计器 UI 公开的属性可以让我修改此行为? (我找不到任何东西)。

第三个问题:我看到了如何通过使用与 DataContext 关联的 DataShape 对象来控制 DataContext 中相关记录的加载的描述。这就是我的本意吗?如果有的话,有没有像 NerdDinner 这样的教程,不仅可以展示如何做,还可以建议正常使用的“模式”?

【问题讨论】:

  • " 看起来(我很高兴证明这是错误的),只要我访问 s 加载所有相应的 RSVP 对象" 这是什么意思?您是否检查了分析器,RSVP SQL 是否正在运行?它是否返回行?
  • 我在调试器中检查了 Dinner 对象,并深入研究了似乎已填充的 RSVPs 成员。也许是我在调试器中查看它导致它被填充的事实?有没有简单的判断方法?
  • 加里就是这样。你检查它,你加载它。
  • jfar 说了什么。调试器将填充您检查的内容。

标签: asp.net-mvc visual-studio linq linq-to-sql


【解决方案1】:

当您具有 1:M 关系时,L2S 代码生成器将为单个实体生成一个实体类,并在该实体中包含一组子对象的实体。当您检索单个(父)实体时,L2S 将不会检索子对象,直到您尝试以某种方式访问​​子对象的集合。这称为延迟加载。我知道,除了从不尝试访问子对象的集合之外,没有办法阻止 L2S 检索子对象。但请注意,如果您从不访问子集合,L2S 将不会检索子行。因此,由于您的应用程序正在检索子行,因此您必须以某种方式访问​​该集合。

您还可以通过让 L2S 在您尝试访问集合之前自动检索子对象来执行所谓的“急切加载”。但是,听起来这不是您想要做的。

【讨论】:

  • 所以你是说我不应该看到这种行为? (实际上,我可能不是 - 请参阅我对 jfar 评论的回答)。
  • 正确。如果您访问该集合,即使在调试器中,您也会加载该集合。
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
相关资源
最近更新 更多