EF4和AddObject对相关集合的不希望的加载

时间:2011-05-02 06:21:50

标签: entity-framework entity-framework-4 lazy-loading eager-loading

我有一个奇怪的情况,即添加记录会导致不必要的相关集合加载。

例如,我有请求和会话。会话可以包含许多请求。我已经加载了会话,只想添加一个新请求。

但是,当我在Request存储库的ObjectSet上设置调用AddObject时,SQL事件探查器会显示对该会话上所有相关请求执行的选择查询。

以下是问题代码:

this._request = new Request
                    {
                        Action = (string)filterContext.RouteData.Values["action"],
                        Controller = filterContext.Controller.GetType().Name,
                        DateAdded = userContext.Session.DateLastActive,
                        IpAddress = filterContext.HttpContext.Request.UserHostAddress,
                        SessionId = userContext.Session.Id
                    };

loggingService.AddRequest(this._request);

最后一行只是调用我的服务,而这只是调用_objectSet.AddObject(entity)

如果我尝试设置新的Session = userContext.Session(而不是上面的SessionId = userContext.Session.Id),也会发生同样的事情 - 查询将在设置此属性时执行,而不是在AddObject上执行。所以看来EF4认为它需要会话的相关Request集合,因为它被引用了。

但我不需要会话上的相关请求,也不需要使用或引用。所以我不确定为什么EF4会加载它们。我逐步完成了代码,并确认这恰好发生在AddObject(entity)行上(Profiler显示查询在同一个实例中执行)。

为什么会发生这种情况,我怎么能阻止它呢?

提前致谢。

编辑:这是因为EF4正在尝试将新请求添加到相关的Session.Requests集合中,并且还会检索所有其他的请求吗?如果是这样,有什么办法可以阻止这种情况吗?就像我说的,我不需要那些请求,我只需要添加它并继续前进。

1 个答案:

答案 0 :(得分:6)

我猜你正在使用POCO T4模板,它确实怀疑这种行为。问题是POCO模板生成的修复方法。每次分配导航属性,外键或将对象添加到相关对象的集合时,这些方法都会执行对象图修复。这意味着他们也会更新相关实体的导航。在您的方案中,这意味着修正方法会在Request中将Requests添加到Session集合。访问该集合将触发延迟加载。避免这种情况的唯一方法是:

  • 关闭此操作的延迟加载(context.ContextOptions.LazyLoadingEnabled = false
  • Requests
  • 删除Session媒体资源
  • 修改T4模板并删除修正方法
  • 修改T4模板并从Requests属性中移除虚拟(Session不支持延迟加载)