我有一个奇怪的情况,即添加记录会导致不必要的相关集合加载。
例如,我有请求和会话。会话可以包含许多请求。我已经加载了会话,只想添加一个新请求。
但是,当我在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集合中,并且还会检索所有其他的请求吗?如果是这样,有什么办法可以阻止这种情况吗?就像我说的,我不需要那些请求,我只需要添加它并继续前进。答案 0 :(得分:6)
我猜你正在使用POCO T4模板,它确实怀疑这种行为。问题是POCO模板生成的修复方法。每次分配导航属性,外键或将对象添加到相关对象的集合时,这些方法都会执行对象图修复。这意味着他们也会更新相关实体的导航。在您的方案中,这意味着修正方法会在Request
中将Requests
添加到Session
集合。访问该集合将触发延迟加载。避免这种情况的唯一方法是:
context.ContextOptions.LazyLoadingEnabled = false
)Requests
Session
媒体资源
Requests
属性中移除虚拟(Session
不支持延迟加载)