【发布时间】:2010-10-07 06:07:22
【问题描述】:
这个想法是创建一个公开上下文但在 Web 应用程序中处理它的存储的类。
目前这是我所拥有的:
public class EntityContext
{
private static String MAIN_CONTEXT_KEY = "MainContext";
private static TISQLEntities _context;
public static void RemoveContext()
{
if (
HttpContext.Current != null
&&
HttpContext.Current.Items[MAIN_CONTEXT_KEY] != null
)
{
((TISQLEntities)HttpContext.Current.Items[MAIN_CONTEXT_KEY]).Dispose();
HttpContext.Current.Items[MAIN_CONTEXT_KEY] = null;
}
if (_context != null)
{
_context.Dispose();
_context = null;
}
}
public static TISQLEntities Context
{
get
{
if (HttpContext.Current == null)
{
if (_context == null)
{
_context = new TISQLEntities();
}
return _context;
}
if (HttpContext.Current.Items[MAIN_CONTEXT_KEY] == null)
{
HttpContext.Current.Items[MAIN_CONTEXT_KEY] = new TISQLEntities();
}
return (TISQLEntities)HttpContext.Current.Items[MAIN_CONTEXT_KEY];
}
}
}
然后在 Global.asax 文件中:
protected void Application_EndRequest(object sender, EventArgs e)
{
EntityContext.RemoveContext();
}
这个想法是,如果这是通过 Web 应用程序运行的,上下文会在第一次需要时创建(并保存到当前的 HttpContext),并在请求结束时删除。
如果这是 UnitTest 情况,则反对在第一次需要时创建并在 TestCleanup 中删除(在这篇文章中并不重要,只是想澄清 _context 对象)。
现在这背后的想法是至少不必这样做:
using(TISQLEntities context = new TISQLEntities())
{
....
}
每次我想查询。我意识到这可能是我懒惰,但我只是认为它更容易更干净:
EntityContext.Context.User.Select(...)
并且避免在大多数情况下我尽量避免的“使用”。最重要的是,我不会在每次回发时创建 9001 个上下文。
现在我很好奇的是,我是不是在想这个?我应该继续为每个需要的方法创建一个上下文吗?在回帖中说我必须:
- 通过 ID 获取用户
- 从 id 获取网站
- 将站点添加到用户 (user.Site = foundSite)
- 保存用户
这可能需要至少 3 个上下文。实体框架是否足够聪明,可以随时继续创建上下文?
【问题讨论】: