我们有一个多层的Asp.NET Web窗体应用程序。数据层有一个名为DataAccess
的类,它强制IDisposable
,并将我们的实体框架对象上下文的实例作为私有字段。该类有许多公共方法返回各种实体集合,并在处理时将处置其对象上下文。
由于我们遇到过许多问题,我们认为在服务器上保持对象上下文(或DataAccess
的实例)的范围更长是一个很大的优势。有人建议将HttpContext.Current.Items
集合中的实例保留在this post中,以便每个Http请求都有一个实例。
我想知道的是:在HttpContext.Current.Session
对象中存储对象上下文的实例会产生哪些问题/疑虑/问题
实施起来相对较快,不会影响我们现有的许多单元测试。
我们将使用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];
}
干杯。
答案 0 :(得分:18)
答案 1 :(得分:3)
每个请求应该使用一个ObjectContext,不应该将它存储为Session。很容易破坏存储很长时间的ObjectContext中的数据:
如果插入的数据不违反ObjectContext中的规则,但违反了数据库中的规则,该怎么办?如果您插入违反规则的行,您是否会从上下文中删除它?图像情况:您使用一个上下文,突然您有请求在一个表中更改数据,将行添加到另一个表,然后您调用SaveChanges()。其中一个更改会引发约束违规错误。你怎么清理它?清理环境并不容易,只需在下一个请求中获取新的环境即可。
如果有人从数据库中删除数据,而它仍然在上下文中怎么办? ObjectContext缓存数据,并不会不时查看它是否仍然存在或者是否已更改:)
如果有人更改了web.config并且Session丢失了怎么办?似乎您希望依赖Session来存储有关登录用户的信息。表单身份验证cookie是存储此信息的更可靠的地方。在许多情况下,会话可能会丢失。
ObjectContext被设计为短暂的,最好在需要时在请求中创建它并在其末尾处置。
如果每个请求的上下文不适合您,那么您可能会做错事,但不要因使用Session而使情况更糟。