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();
        }
    }

就像我说的,我以前做过这样的代码,而且很好。我是否走运了,或者将实体存储在会话中会导致问题?

更新

我已将代码从全局移动到使用 SaveChanges() 的页面继承的页面基类。同样的问题,所以它规则我们的静态类/方法并将实体存储在会话中以某种方式导致问题。

更新

所以,在我的头撞到墙上几个小时后,我有了一个相当简单的修复,如果烦人的话。在初始获取用户之后,我现在调用

context.Detach(user);

我只能假设与测试环境相比,ASP.NET 中垃圾收集处理上下文的速度有多快。

4

1 回答 1

0

在我的 EF 经验中,当实体仍链接到旧上下文时,似乎总是会出现此问题。我相信总是使用新的上下文重新加载实体是最安全的(在 PK 上查询)。我知道这不是最有效的,但它避免了这个问题。

在回答之前,我查看了此页面,如果您还没有尝试过它的一些建议,您可以试一试:EF Add/Attach

于 2013-04-08T15:11:04.843 回答