我使用实体框架4,我发现,当我点击后退按钮在我的浏览器导航到一个较早的页面,我已经重定向,然后页面将打开,但当我重新提交它的形式,我得到各种奇怪的错误,如,
'一个实体对象不能被多个IEntityChangeTracker实例引用
问题是如何重新提交表单创建这样一个错误,当我知道一个新的db上下文是创建与每个请求新鲜?我可以看到它们正在调试器中创建新的!
在附加代码运行之前,我在上下文中查看了被附加的实体是否已添加,这就是它所说的…
context.Entry(实体);
{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
它的"分离",所以为什么我会得到错误时,附加的实体?
欢呼,伊恩。
该错误没有说明实体是由您的新上下文加载的。该错误表明该实体认为它附加到另一个上下文-可能是您先前请求中已经可以处理的上下文。这是动态代理的一些不良行为——即使旧上下文已被处理,它们也会保持对旧上下文的引用。避免这种情况的唯一方法是不使用代理(=不使用延迟加载和动态更改跟踪)或手动分离会破坏对象图的实体(导航属性将为null)。
怎么会这样?您是否将实体存储在某处(例如在会话中)?一旦你将实体附加到上下文,然后点击后退按钮,你的会话就包含了不能附加到另一个上下文的实体。