带有自跟踪实体的c#控制台应用程序:我应该在哪里存储EF5 DbContext而不是在HttpContext中

本文关键字:DbContext EF5 存储 HttpContext 在哪里 我应该 实体 跟踪 应用程序 控制台 | 更新日期: 2023-09-27 18:16:37

我有一个带有自跟踪实体的大型n层web项目。我使用实体框架5,并将对象上下文存储在HttpContext.Current.Items中,并将其处理在Application_EndRequest上,如下所述。我有一个单独的框架类库项目(CMS.Framework),其中包含所有(自跟踪)POCO类和更多的逻辑。实际的ASP。. NET Web Forms应用程序参考我的CMS。框架项目。到目前为止,一切正常。

现在,我想创建一个控制台应用程序(用于计划的服务器任务),并使用我的CMS。框架类库。但是,当自我跟踪实体试图初始化(并调用静态CoreContext属性)时,由于HttpContext.Current为空,将抛出System.NullReferenceException。这对我来说是有意义的,因为我们现在正在制作一款主机应用。以下是我的代码,只在控制台应用程序中中断:

    /// <summary>
    /// Gets the CmsCoreContext in order to access the CMS_Core DB. This context
    /// will be disposed when the application onloads (EndRequest).
    /// </summary>
    protected static CmsCoreContext CoreContext
    {
        get
        {
            if (!HttpContext.Current.Items.Contains("CoreContext"))
            {
                // Set Entity Framework context here and reuse it throughout the application
                HttpContext.Current.Items.Add("CoreContext", new CmsCoreContext());
            }
            return HttpContext.Current.Items["CoreContext"] as CmsCoreContext;
        }
    }

我应该在哪里存储new CmsCoreContext()当HttpContext。电流为空?是否有我可以使用的控制台应用程序上下文?对此有什么建议吗?

带有自跟踪实体的c#控制台应用程序:我应该在哪里存储EF5 DbContext而不是在HttpContext中

假设您只想在控制台应用程序的整个生命周期中使用对象上下文的单个实例?像这样的代码应该可以工作:

private static CmsCoreContext _coreContext;
protected static CmsCoreContext CoreContext
{
   get
   {
      if (!System.Web.Hosting.HostingEnvironment.IsHosted)
      {
         return _coreContext ?? (_coreContext = new CmsCoreContext());
      }
      var context = HttpContext.Current;
      if (context == null) throw new InvalidOperationException();
      if (!context.Items.Contains("CoreContext"))
      {
         context.Items.Add("CoreContext", new CmsCoreContext());
      }
      return (CmsCoreContext)context.Items["CoreContext"];
   }
}
// The Application_EndRequest event won't fire in a console application.
public static void ConsoleCleanup()
{
   if (_coreContext != null)
   {
      _coreContext.Dispose();
   }
}