2011-03-18 43 views
0

可以说我有一个播放列表类与一些引用的类。 播放列表实体集合被放置到数据上下文包装:为什么实体框架V1使用SELECT多次访问数据库,而实体已经被加载?

public new IQueryable<Playlist> Playlist 
    { 
     get 
     { 
      return base.Playlist 
       .Include("PlaylistStep") 
       .Include("PlaylistStepAttachment"); 
     } 
    } 

上下文是在每个Web请求的基础应用组件之间共享。 第一次调用播放列表的实体的样子:

  var playlist = 
      dataContext 
       .Playlist 
       .Where(x => x.OwnerUserId == ownerId) 
       .OrderBy(x => x.Name) 
       .Skip((page - 1) * count) 
       .Take(count) 
       .ToList(); 

这会产生相应的SQL语句,并加载一些播放列表到背景下,据我了解。然后在相同的Web请求我有几个电话:

  var playlist = dataContext 
       .Playlist 
       .Where(x => x.PlaylistId == id) 
       .FirstOrDefault(); 

其中播放列表ID是一样的第一个请求过程中得到。 令我惊讶的是后续的调用也会生成SQL语句,尽管这些实体已经加载到上下文中。我相信已经在上下文中的实体应该返回,而不是由DB再次检索。

可以请别人告诉我我错在哪里,或者这种行为对EF来说是正常的吗?

+0

对这个问题不知道多少。但知道EF ** V1 **有很多问题,这就是为什么我们有** EF4 ** – gideon 2011-03-18 16:58:42

回答

0

你看到的行为是正常的,因为枚举ObjectQuery<T>总是做一个数据库查询。

您可以通过查看ObjectContext.ObjectStateManager来查询本地加载的对象。这工作正常,虽然语法不太直观。

EF 4.1引入了新的DbSet<T>.Local属性,其中makes this easier