基础提供程序在Open和其他具有本地DbContext变量的异常上失败

问题描述

我们在整个项目中都有一个静态的DbContext。 这是get方法

public static istanbulEntities DbContext
{
    get
    {
        string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString("x");
        if (!HttpContext.Current.Items.Contains(ocKey))
            HttpContext.Current.Items.Add(ocKey,new istanbulEntities());
        return HttpContext.Current.Items[ocKey] as istanbulEntities;
    }
}

我们在Global.asax中遇到一些例行任务时遇到了例外,这些问题是:

  • 属性“ id”是对象键信息的一部分,无法修改
  • 已成功提交对数据库的更改,但是在更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:由于多个“ TBL_MAIL”类型的实体具有相同的主键值,因此保存或接受更改失败。确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。将实体设计器用于数据库优先/模型优先配置。使用“ HasDatabaseGeneratedOption”流利的API或“ DatabaseGeneratedAttribute”进行代码优先配置。

即使从未显式修改任何对象的主键,也遇到了这些错误。 为了解决这个问题,我们决定使用局部变量代替静态DbContext,即声明为:

var db = new istanbulEntities();

但是,我们通过同时安排所有例行任务来测试了所有例行任务,并且开始出现更多错误

  • 基础提供程序在Open上失败。
  • 创建模型时不能使用上下文。如果在OnModelCreating方法内部使用上下文,或者多个线程同时访问同一上下文实例,则可能引发此异常。请注意,不能保证DbContext和相关类的实例成员是线程安全的。
  • 已成功提交对数据库的更改,但是在更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:由于多个“ TBL_MAIL_Box”类型的实体具有相同的主键值,因此保存或接受更改失败。确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。将实体设计器用于数据库优先/模型优先配置。使用“ HasDatabaseGeneratedOption”流利的API或“ DatabaseGeneratedAttribute”进行代码优先配置。

我们怀疑第一个错误会导致后一个错误。连接字符串没有问题,因为它以前可以正常工作。我们仍然没有修改任何主键。 我们还认为并发插入存在问题,但是在线上没有很多类似的示例,因此我们不确定该如何处理。

这些异常是否是由于尝试使用本地DbContext变量打开许多与数据库的连接而又仍然保持静态DbContext对象引起的?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)