UPDATE:据我所知,我是在想象下面描述的问题。所以,这几乎是一个没有问题的问题。未来的读者,继续前进..。这里没什么可看的。
我有一个ASP.NET MVC项目,很像NerdDinner教程的例子。(我使用的是MVC 2,但为了创建它,我遵循了NerdDinner教程)。
按照本教程第3部分中的说明,我创建了一个"Linq类“(.dbml)面,并将我的数据库表放到它上,从而创建了一个从Linq到SQL的数据库模型。设计器根据我的数据库表自动添加了生成的类之间的关系。
假设我的类与NerdDinner示例相同,所以我有晚餐表和RSVP表,其中每个晚餐记录都与许多RSVP记录相关联-因此在生成的类中,晚餐对象有一个RSVP属性,它是RSVP对象的列表。
我的问题是这个:它看起来(我很高兴地证明在这一点上是错的),一旦我访问了一个晚餐对象,它就会加载所有相应的RSVP对象,即使我不使用RSVP成员。
第一个问题:这真的是生成类的默认行为吗?
在我的特殊情况下,对象图包含了更多的表(这些表有更多的记录),因此这是灾难性的行为--当我只想显示一个单亲记录的细节时,我将加载大量的数据。
第二个问题:通过designer UI公开的属性是否允许我修改这种行为?(我找不到)。
第三个问题:我看到了关于如何通过使用与DataContext关联的DataShape
对象来控制DataContext
中相关记录的加载的描述。这就是我要做的事情吗?如果是这样的话,是否有像NerdDinner这样的教程,不仅可以展示如何做到这一点,而且还可以为正常使用提供一个“模式”?
发布于 2010-03-12 14:41:54
当您拥有1:M关系时,L2S代码生成器将为单个实体生成一个实体类,并在该实体中包含一组子对象。当您检索单一(父)实体时,L2S将不会检索子对象,除非您尝试以某种方式访问子对象集合。这就是所谓的延迟加载。据我所知,除了从未尝试访问子对象集合之外,没有其他方法可以阻止L2S检索子对象。但是请注意,如果您从未访问过子集合,L2S将不会检索子行。因此,由于应用程序正在检索子行,因此必须以某种方式访问集合。
您还可以通过让L2S在尝试访问集合之前自动检索子对象来执行所谓的“急切加载”。然而,听起来这并不是你想要做的。
发布于 2010-03-12 14:44:40
http://www.davidhayden.com/blog/dave/archive/2007/08/05/LINQToSQLLazyLoadingPropertiesSpecifyingPreFetchWhenNeededPerformance.aspx
http://www.davidhayden.com/blog/dave/archive/2009/02/12/LINQToSQLTutorialsLazyLoadingPropertiesPerformance.aspx
https://stackoverflow.com/questions/2433422
复制相似问题