4

我有一个属性State,当设置它时,它会更新数据库中的实体。

问题是这个属性是跨多个线程设置的,有时作业字段同时附加到两个上下文,导致以下异常:

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

我试图在using语句周围使用锁,但这不起作用:

private Job job;

public string State 
{
    get
    {
        return job.State;
    }
    set
    {
        lock (job)
        {
            using (MyEntities context = new MyEntities())
            {
                context.Jobs.Attach(job);
                job.State = value;

                context.SaveChanges();
            }
        }
    }
}

解决此问题的最佳方法是什么?

4

2 回答 2

1

如果您可以分离对象并且之后没有丢失任何内容,则可以在保存后将其从上下文中分离:

lock (job)
{
     using (MyEntities context = new MyEntities())
     {
           context.Jobs.Attach(job);
           job.State = value;
           context.SaveChanges();
           context.Detach(job);  // Detach the object
      }
}

更新:

我已经测试了一个类似的场景,我发现没有问题。我怀疑该实体job在进入关键部分之前已附加到某个上下文。如果有一些关系,您可以通过http://blogs.msdn.com/b/alexj/archive/2009/06/08/tip-24-how-job中的建议方式检查实体是否附加到某些上下文从一个实体.aspx 获取对象上下文

于 2013-10-03T08:42:22.717 回答
0

问题是锁定job不起作用。我不确定为什么。

实现专用锁object效果很好:

private Job job;

private static object jobInstanceLock;

public string State 
{
    get
    {
        return job.State;
    }
    set
    {
        lock (jobInstanceLock)
        {
            using (MyEntities context = new MyEntities())
            {
                context.Jobs.Attach(job);
                job.State = value;

                context.SaveChanges();
            }
        }
    }
}
于 2013-10-03T11:23:10.003 回答