我没有为我的目的找到类似的问题/答案。
在我的控制器(MVC 4/EF 5 应用程序)的一些操作中,我有更新数据库的功能,但这些功能不影响用户输出(选择后更新信息的功能)。我想在异步线程中发送这些函数(这将在用户获得渲染页面后完成)。我不想等待线程完成并渲染页面。在这种情况下,数据库上下文呢?我的上下文生命周期是“每个请求”,它在 Application_EndRequest 中删除:
protected virtual void Application_EndRequest()
{
var entityContext = HttpContext.Current.Items["_Context"] as DbContext;
if (entityContext != null)
entityContext.Dispose();
}
我在线程中使用自己的上下文(使用块进行正确处理)。
using (DbContext db = new DbContext())
{
....
}
但是,如果我想在线程中将实体附加到 DbContext,我会在几种情况下收到错误消息“ObjectStateManager 中已存在具有相同键的对象”。这很奇怪,因为我使用带有 AsNoTracking() 选项的加载,并且实体状态在调用新线程之前在主上下文中“分离”。在其他情况下,当我在线程中再次尝试来自数据库的请求实体并对其进行修改(而不是附加)时,我多次出现错误“对象处于分离状态” Context 的两个实例是否使用一个 ObjectStateManager?并且错误的出现取决于主线程上下文处理的时间。我的意思是在处理主上下文之前或之后我在线程中使用上下文......
在这种情况下,如何使用具有自己的上下文的异步线程?谢谢。