Jer*_*ose 6 entity-framework lazy-loading eager-loading entity-framework-4
我有一个奇怪的情况,添加一个记录导致不必要的相关集合加载.
例如,我有请求和会话.会话可以包含许多请求.我已经加载了会话,只想添加一个新请求.
但是,当我在请求存储库的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);
Run Code Online (Sandbox Code Playgroud)
最后一行只调用我的服务,而这只是调用_objectSet.AddObject(entity)
.
如果我尝试设置新的Request Session = userContext.Session
(而不是上面的SessionId = userContext.Session.Id
),也会发生同样的事情- 查询将在设置此属性时执行,而不是在AddObject上执行.所以看来EF4认为它需要会话的相关Request集合,因为它被引用的原因.
但我不需要会话上的相关请求,也不需要使用或引用.所以我不确定为什么EF4会加载它们.我逐步完成了代码,并验证了这种情况正好AddObject(entity)
在线上(Profiler显示查询在同一个实例中执行).
为什么会发生这种情况,我怎么能阻止它呢?
提前致谢.
编辑:这是因为EF4正在尝试将新请求添加到相关的Session.Requests集合中,并检索所有其他的请求吗?如果是这样,有什么办法可以阻止这种情况吗?就像我说的,我不需要那些请求,我只需要添加它并继续前进.
我猜你正在使用POCO T4模板,它确实怀疑这种行为.问题是POCO模板生成的修复方法.每次分配导航属性,外键或将对象添加到相关对象的集合时,这些方法都会执行对象图修复.这意味着他们也会更新相关实体的导航.在您的场景中,这意味着修复方法会添加Request
到Requests
集合中Session
.访问该集合将触发延迟加载.避免这种情况的唯一方法是:
context.ContextOptions.LazyLoadingEnabled = false
)Requests
属性Session
Requests
属性中删除虚拟(Session
不支持延迟加载) 归档时间: |
|
查看次数: |
1265 次 |
最近记录: |