首页 文章

调用“context.AttachTo”时 - ObjectContext实例已被释放,不能再用于需要连接的操作

提问于
浏览
0

我很难通过新的上下文对实体对象进行更改 . 我之前已经有过很多次这样的工作了,但是在这个例子中我得到了旧的“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 回答

  • 0

    在我的EF体验中,当实体仍然链接到旧上下文时,似乎总是会发生此问题 . 我认为始终只使用新上下文(PK查询)重新加载实体是最安全的 . 我知道它不是最有效的,但它避免了这个问题 .

    在回答之前我看过这个页面,如果你还没有尝试过一些建议,你可以给他们一个去:EF Add/Attach .

相关问题