2010-03-12 51 views
0

UPDATE:从我听到的情况来看,我想象的是我在下面描述的问题。所以,这几乎不是问题。未来的读者,继续前进...在这里没有什么可看的。如何阻止自动生成的Linq to SQL类加载所有数据?


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

根据本教程的part 3中的说明,我通过创建一个“Linq to SQL Classes”(.dbml)表面并将我的数据库表放到它上面来创建了我的数据库的Linq-to-SQL模型。设计者根据我的数据库表自动添加生成的类之间的关系。假设我的类是根据NerdDinner示例的,所以我有Dinner和RSVP表,每个Dinner记录都与许多RSVP记录相关联 - 因此在生成的类中,Dinner对象具有RSVPs属性,它是一个RSVP对象列表。

我的问题是这样的:它出现(和我会很乐意被证明是错误的这一点),一旦我 访问Dinner对象,它加载所有相应的RSVP对象,即使我请勿使用RSVPs会员。

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

在我的特殊情况下,对象图包含更多的表(它的数量级更多的记录),所以这是灾难性的行为 - 当我想要做的就是显示数据时,我会加载大量数据单亲记录的细节。

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

第三个问题:我已经看到了如何通过使用带有DataContext的相关的DataShape对象控制在DataContext相关记录加载的描述。那是我要做的事情吗?如果有的话,是否有像NerdDinner这样的教程不仅会展示如何去做,还会为正常使用提供一个“模式”?

+0

“看来(和我会很乐意被证明是错误的这一点),一旦我访问■装载所有相应的RSVP对象的” 这是什么意思?您是否检查分析器,RSVP SQL是否正在运行?它是否返回行? – jfar 2010-03-12 14:43:16

+0

我在调试器中检查了Dinner对象,并深入到RSVPs成员中,该成员似乎已经填充。也许这是事实,我在调试器中查看它导致它被填充?有一种简单的方法可以告诉吗? – 2010-03-12 14:46:22

+1

那就是Gary的情况。你检查它,你加载它。 – jfar 2010-03-12 14:52:07

回答

1

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

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

+0

所以你说我不应该看到这种行为? (事实上​​,我可能不会 - 看到我对jfar评论的回答)。 – 2010-03-12 14:47:28

+0

正确。如果您访问集合,即使在调试器中,您也将加载该集合。 – 2010-03-12 15:04:22

相关问题