如何解决基础提供程序在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 举报,一经查实,本站将立刻删除。