这个想法是创建一个类,它暴露上下文但处理它在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),并在请求结束时被撤销。
如果这是一个单元测试的情况,它会在第一次需要时创建,并在TestCleanup中被移除(在本帖中不是很重要,但我只是想澄清_context对象)。
现在,至少不必再这样做:
using(TISQLEntities context = new TISQLEntities())
{
....
}
每次我想要查询时,我意识到这可能是因为我懒惰,但我认为这样做更容易、更干净:
EntityContext.Context.User.Select(...)
并避免“使用”,对于大多数情况我都尽量避免使用。此外,我不会在每次postback时创建9001个上下文。
现在我很好奇的是,我是否过于考虑了这个问题?我应该只为每个需要一个上下文的方法创建上下文吗?比如在postback时我必须:
- 通过ID获取用户 - 通过ID获取站点 - 将站点添加到用户中(user.Site = foundSite) - 保存用户
这可能至少涉及3个上下文。Entity Framework是否足够聪明,可以随时创建上下文呢?