我很难通过新的上下文对实体对象进行更改 . 我之前已经有过很多次这样的工作了,但是在这个例子中我得到了旧的“ObjectContext实例已被处理”异常 .
这是我的快速编辑/保存代码:
private void SaveChanges()
{
using (var context = new Manticore.ManticoreContext(Global.ManticoreClient))
{
**context.AttachTo("Users", Global.LoggedInUser);**
Global.LoggedInUser.FirstName = this.FirstNameText.Text;
Global.LoggedInUser.LastName = this.LastNameText.Text;
Global.LoggedInUser.Email = this.EmailText.Text;
context.SaveChanges();
}
}
Global.LoggedInUser属性(实例化):
public static Manticore.User LoggedInUser
{
get
{
return HttpContext.Current.Session["LoggedInUser"] as Manticore.User;
}
set
{
HttpContext.Current.Session["LoggedInUser"] = value;
}
}
而踢球者在这里是一个快速的单元测试工作(现在没有断言,但没有抛出异常):
private User _testUser;
private TestInstanceBucket _testBucket;
[TestInitialize]
public void TestInitialize()
{
using (var context = new Manticore.ManticoreContext())
{
this._testBucket = new TestInstanceBucket(context);
this._testUser = this._testBucket.TestUser;
context.AddObject("Users", this._testUser);
context.SaveChanges();
}
}
[TestMethod]
public void User_ShouldBeAbleToChangeDetails()
{
using (var context = new ManticoreContext())
{
context.AttachTo("Users", this._testUser);
this._testUser.FirstName = "New";
context.SaveChanges();
}
}
就像我说的那样,我之前已经完成了这样的代码,并且一切都很好 . 我是否幸运,或者可以在会话中存储实体导致问题?
Update
我已将代码从全局移动到使用SaveChanges()继承的页面的pagebase类 . 同样的问题因此它规则我们的静态类/方法并以某种方式将实体存储在会话中导致问题 .
Update
因此,经过几个小时的撞击墙壁,我有一个修复,如果烦人的话相当简单 . 在我最初提取用户之后,我现在打电话
context.Detach(user);
我只能假设它与在测试环境中使用ASP.NET中的垃圾收集处理上下文的速度有关 .
1 回答
在我的EF体验中,当实体仍然链接到旧上下文时,似乎总是会发生此问题 . 我认为始终只使用新上下文(PK查询)重新加载实体是最安全的 . 我知道它不是最有效的,但它避免了这个问题 .
在回答之前我看过这个页面,如果你还没有尝试过一些建议,你可以给他们一个去:EF Add/Attach .