ASP.NET会话对象中的实体框架对象上下文?

时间:2010-03-05 01:28:49

标签: asp.net entity-framework session httpcontext objectcontext

我们有一个多层的Asp.NET Web窗体应用程序。数据层有一个名为DataAccess的类,它强制IDisposable,并将我们的实体框架对象上下文的实例作为私有字段。该类有许多公共方法返回各种实体集合,并在处理时将处置其对象上下文。

由于我们遇到过许多问题,我们认为在服务器上保持对象上下文(或DataAccess的实例)的范围更长是一个很大的优势。有人建议将HttpContext.Current.Items集合中的实例保留在this post中,以便每个Http请求都有一个实例。

我想知道的是:在HttpContext.Current.Session对象中存储对象上下文的实例会产生哪些问题/疑虑/问题

  • 我假设Session对象已完成并在用户会话到期时设置为垃圾回收,因此实例将正确处理。
  • 我假设大多数默认浏览器设置都会让我们的应用程序放置其SessionId cookie而不会有任何疑虑。
  • 对象上下文将要处理的数据量不是很大,并且不会对我们体面的服务器硬件造成问题,关于随时间缓存和相对较少的并发用户。

实施起来相对较快,不会影响我们现有的许多单元测试。

我们将使用AutoFac和ServiceProvider类来提供实例。当需要ObjectContext的实例时,它将由类似于此的代码返回:

private static Entities GetEntities(IContext context)
{
    if (HttpContext.Current == null)
    {
        return new Entities();
    }

    if (HttpContext.Current.Session[entitiesKeyString] == null)
    {
        HttpContext.Current.Session[entitiesKeyString] = new Entities();
    }

    return (Entities)HttpContext.Current.Session[entitiesKeyString];
}

干杯。

2 个答案:

答案 0 :(得分:18)

答案 1 :(得分:3)

每个请求应该使用一个ObjectContext,不应该将它存储为Session。很容易破坏存储很长时间的ObjectContext中的数据:

  1. 如果插入的数据不违反ObjectContext中的规则,但违反了数据库中的规则,该怎么办?如果您插入违反规则的行,您是否会从上下文中删除它?图像情况:您使用一个上下文,突然您有请求在一个表中更改数据,将行添加到另一个表,然后您调用SaveChanges()。其中一个更改会引发约束违规错误。你怎么清理它?清理环境并不容易,只需在下一个请求中获取新的环境即可。

  2. 如果有人从数据库中删除数据,而它仍然在上下文中怎么办? ObjectContext缓存数据,并不会不时查看它是否仍然存在或者是否已更改:)

  3. 如果有人更改了web.config并且Session丢失了怎么办?似乎您希望依赖Session来存储有关登录用户的信息。表单身份验证cookie是存储此信息的更可靠的地方。在许多情况下,会话可能会丢失。

  4. ObjectContext被设计为短暂的,最好在需要时在请求中创建它并在其末尾处置。

    如果每个请求的上下文不适合您,那么您可能会做错事,但不要因使用Session而使情况更糟。