gpt4 book ai didi

entity-framework - EF4 和使用 AddObject 意外加载相关集合

转载 作者:行者123 更新时间:2023-12-04 08:30:14 25 4
gpt4 key购买 nike

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

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

但是,当我在 Request 存储库的 ObjectSet 上设置 call AddObject 时,SQL Profiler 会显示在该 session 的所有相关请求上执行的选择查询。

这是问题代码:

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 似乎认为它在出于某种原因被引用时需要 session 上的相关请求集合。

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

为什么会发生这种情况,我该如何阻止它?

提前致谢。

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

最佳答案

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

  • 关闭此操作的延迟加载 ( context.ContextOptions.LazyLoadingEnabled = false )
  • 删除 Requests属性(property)来自 Session
  • 修改 T4 模板并删除修复方法
  • 修改 T4 模板并从 Requests 中删除虚拟属性(Session 不支持延迟加载)
  • 关于entity-framework - EF4 和使用 AddObject 意外加载相关集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5854043/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com