.net EntityFramework-回击按钮并重新提交会导致错误

.net EntityFramework-回击按钮并重新提交会导致错误,.net,asp.net-mvc-3,entity-framework-4.1,.net,Asp.net Mvc 3,Entity Framework 4.1,我使用的是Entity Framework 4,我发现当我点击浏览器上的“后退”按钮导航到之前的页面时,该页面将打开,但当我重新提交表单时,会出现各种奇怪的错误,例如 '一个实体对象不能被IEntityChangeTracker的多个实例引用 问题是,据我所知,每次请求都会创建一个新的db上下文,那么重新提交表单怎么会产生这样的错误呢?我可以看到它们在调试器中被新建 在运行附加代码之前,我在上下文中查看是否添加了要附加的实体,这就是它所说的 上下文。条目(实体) 它是“分离的”,那么为什么在附加

我使用的是Entity Framework 4,我发现当我点击浏览器上的“后退”按钮导航到之前的页面时,该页面将打开,但当我重新提交表单时,会出现各种奇怪的错误,例如

'一个实体对象不能被IEntityChangeTracker的多个实例引用

问题是,据我所知,每次请求都会创建一个新的db上下文,那么重新提交表单怎么会产生这样的错误呢?我可以看到它们在调试器中被新建

在运行附加代码之前,我在上下文中查看是否添加了要附加的实体,这就是它所说的

上下文。条目(实体)

它是“分离的”,那么为什么在附加实体时会出现错误


干杯,伊恩。

错误并不是说实体是由新上下文加载的。错误表示该实体认为它附加到了另一个上下文——可能是您先前请求中的上下文,该上下文已经可以处理。这是动态代理的一些不好的行为——即使旧上下文已被释放,它们也会保留对旧上下文的引用。避免这种情况的唯一方法是不使用代理(=不使用延迟加载和动态更改跟踪)或手动分离将破坏对象图的实体(导航属性为空)


这怎么会发生?您是否将实体存储在某个位置(例如在会话中)?一旦您将实体附加到上下文,然后单击“上一步”按钮,您的会话包含无法附加到其他上下文的实体。

上下文不是线程安全的。您没有缓存此上下文,是吗?完成后您是否正在处理上下文?不,我没有明确地处理它们,但正如我所说的,我可以看到它们在调试器中是新出现的。我最近在一次会议上,有人提出了一个奇怪的问题,如果我记得的话,他们在处理上下文交叉请求时遇到了这个问题。为了让终结器满意,请将其包装在using语句中进行处理,然后重试。除了一个体面的起点,它可能不会改变任何事情。任何实现IDisposable的东西都应该被处理掉。另外,因为它们是新的,并不意味着周围没有任何静态的遗留信息(我不确定内部结构-只是说一个新对象不能保证100%的干净状态-特别是在幕后它使用线程上下文等)是的,你说的听起来很有道理。:)您好,我正在ASP.net MVC筛选器中加载实体,然后将其分配给控制器基类。然后,控制器将实体传递给使用不同上下文的服务。我似乎已经通过在注入上下文时使用“每个web请求”生命周期管理器消除了这个错误。这似乎仍然很奇怪,虽然我应该只有在按下后退按钮并重新提交时,而不是在正常的页面使用时,才会出现这个错误。
{System.Data.Entity.Infrastructure.DbEntityEntry`1[Entities.Orders.Order]}
CurrentValues: 'context.Entry(entity).CurrentValues' threw an exception of type 'System.InvalidOperationException'
Entity: {Entities.Orders.Order}
OriginalValues: 'context.Entry(entity).OriginalValues' threw an exception of type 'System.InvalidOperationException'
State: Detached