关于我如何访问我的DataContext(以及它是否错误)

本文关键字:是否 错误 DataContext 我的 于我如 访问 何访问 | 更新日期: 2023-09-27 18:25:18

我使用以下static class访问应用程序中的数据上下文

public static class DataContext
{
    internal const string _contextDataKey = "dataContext";
    /// <summary>
    /// Returns a unique data context that lives for the duration of the request, which can be from ASP.NET or a WCF service
    /// </summary>
    /// <returns>The entity data model context for the current request</returns>
    public static EntityDataModelContext GetDataContext()
    {
        IPersistanceContainer state;
        if (HttpContext.Current != null)
        {
            state = new AspNetPersistanceContainer();
        }
        else if (OperationContext.Current != null)
        {
            state = new WcfPersistanceContainer();
        }
        else
        {
            state = new StaticPersistanceContainer(); // this container is thread-unsafe.
        }
        EntityDataModelContext edm = state.Get<EntityDataModelContext>(_contextDataKey);
        if (edm == null)
        {
            edm = new EntityDataModelContext();
            state.Store(_contextDataKey, edm);
        }
        return edm;
    }
}

忘掉其他容器吧,它们分别用于WCFConsole应用程序简单测试,这里是ASP.NET容器:

internal class AspNetPersistanceContainer : IPersistanceContainer
{
    public T Get<T>(string key) where T : class
    {
        if (HttpContext.Current.Items.Contains(key))
            return (T)HttpContext.Current.Items[key];
        return null;
    }
    public void Store(string key, object value)
    {
        HttpContext.Current.Items[key] = value;
    }
}

当我需要访问context时,我只调用DataContext.GetDataContext()并进行DB访问,从不添加任何using语句。

如果我添加一个using语句,那么context只适合一次使用,下次我尝试使用它时,它就会被丢弃。引发异常。

如果我现在不这样做,这会让我有点不开心,我觉得这也不是正确的做法,也不是处理它

所以我想知道在这里做什么才是正确的。

这个设计有缺陷吗?我应该彻底放弃它吗?

我应该想办法在处理完上下文后重新创建它吗?

我应该让设计保持原样吗?

也许设计"足够精细",你有什么建议我读的关于这个主题的书吗?我觉得我在后端架构方面的技能相当欠缺。

关于我如何访问我的DataContext(以及它是否错误)

在asp.net应用程序中,一个解决方案可以是这样的:

  1. 在请求开始时创建上下文
  2. 请求结束时处理它

这是一篇讨论这种方法的文章(对于NHibernate会话管理,但对于EF几乎相同)