2

我正在使用实体框架制作一个 MVC 3 Web 应用程序,但我收到了这个错误。在我的数据层中,我使用了一个类连接助手。

错误如下:

项目已添加。字典中的键:'DbActiveContext' 添加的键:'DbActiveContext'

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:已添加项目。字典中的键:'DbActiveContext' 添加的键:'DbActiveContext'

错误在第 24 行:

Line 22:                 {
Line 23:                     _connection = new flashEntities(ConnectionString);
**Line 24:                     HttpContext.Current.Items.Add("DbActiveContext", _connection);**
Line 25:                 }
Line 26:                 return _connection;

我的连接助手类如下(相同的连接助手类在另一个 mvc 3 Web 应用程序中工作正常):

public ObjectContext Connection
    {
        get
        {
            if (_connection == null && HttpContext.Current.Items["DbActiveContext"] != null)
            {
                _connection = (flashEntities)HttpContext.Current.Items["DbActiveContext"];
            }
            else
            {
                _connection = new flashEntities(ConnectionString);
                HttpContext.Current.Items.Add("DbActiveContext", _connection);
            }
            return _connection;
        }
    }
    private ObjectContext _connection;

    public string ConnectionString
    {
        get
        {
            return ConfigurationManager.ConnectionStrings["flashEntities"].ToString();
        }
    }

任何帮助都将是非常可观的。谢谢

4

2 回答 2

1

有什么东西导致了这条线

 HttpContext.Current.Items.Add("DbActiveContext", _connection);  

执行多次。再看看你的 If 条件。你会导致它不止一次失败吗?说如果 _Connection 被设置为 null ...

于 2013-05-20T18:31:03.173 回答
0

线程可能会导致这种情况。如果没有看到调用它的代码,很难判断这里是否是这种情况,但请考虑两个线程都要求 dbcontext。你的代码大致是:

1. if (!dbcontext)
    2. add dbcontext

把它想象成:

线程 1 执行第 1 行,分支到第 2 行
线程 2 执行第 1 行,分支到第 2 行
线程 1 执行第 2 行,现在添加 dbcontext
线程 2 执行第 2 行,尝试添加 dbcontext,asplode。

非常经典的线程问题。

您可以使用锁来防止这种情况:

private object creationLock = new object();

. . .

lock(creationLock)
{
    if (...)
        add...
}
于 2013-05-20T22:55:19.863 回答