抛出一个简单的获取/更新方法的OptimisticConcurrencyException

时间:2013-11-29 15:37:50

标签: c# entity-framework-4 visual-web-developer-2010

环境 实体框架4; Visual Web Developer Express 2010;数据库第一; SQL Server Express

问题

我想从数据库中获取一行,更新一个字段并保存回数据库。 为什么以下方法抛出OptimisticConcurrencyException

public static void SetReturnVisit(int firstAppointmentSlotID, int returnAppointmentSlotID) {
    AppointmentSlot slot = m_db.AppointmentSlots.SingleOrDefault(m => m.AppointmentSlotID == firstAppointmentSlotID);
    slot.ReturnAppointmentSlotID = returnAppointmentSlotID;
    m_db.SaveChanges();       
}

m_db是我的ObjectContext实体类 AppointmentSlot数据库表包含名为Timestamp的{​​{1}}字段 实体上的Concurrency属性配置如下:

  • ConcurrencyStoreGeneratedPattern
  • ComputedConcurrency Mode

我作为一名开发人员工作,所以没有别的东西正在修改记录。

我尝试了各种方法,例如分离项目,更新字段和重新附加。

Fixed

同样的问题,异常抛出,无论如何都没有意义。

我在保存之前检查了public static void SetReturnVisit(int firstAppointmentSlotID, int returnAppointmentSlotID) { AppointmentSlot slot = m_db.AppointmentSlots.SingleOrDefault(m => m.AppointmentSlotID == firstAppointmentSlotID); m_db.AppointmentSlots.Detach(slot); slot.ReturnAppointmentSlotID = returnAppointmentSlotID; m_db.AppointmentSlots.Attach(slot); m_db.ObjectStateManager.ChangeObjectState(slot, EntityState.Modified); m_db.SaveChanges(); } 字段的值,它与数据库中的字段相同。

我甚至玩弄了Concurrency值,将其转换为Base 64字符串,然后转换回字节数组

Concurrency

我错过了什么吗?还有我应该做的另一个电话吗?

除了这种行为之外,当从数据库中获取并查看已分离的项目然后保存时,乐观并发工作正常。

请注意,我未提供string c = Convert.ToBase64String(slot.Concurrency); slot.Concurrency = Convert.FromBase64String(c); 代码。

更新

以下按预期方式工作:

Try/Catch

更新20131206

令人困惑的是,我添加了另一种使用相同方法的方法(获取 - 更新某些字段 - 保存回来),这不会导致异常,因此问题必须更高。也许正在举行一些参考。

1 个答案:

答案 0 :(得分:0)

为了将来参考我已经弄明白了。我正在使用每个请求方法的一个上下文。似乎必须在上下文中的某处保留引用。如果我将我的代码更改为以下代码,那么它将按预期工作。

using(AppEntities ae = new AppEntities()){
    var slot = ae.AppointmentSlots.Single(m => m.AppointmentSlotID == firstAppointmentSlotID);
    slot.ReturnAppointmentSlotID = returnAppointmentSlotID;
    ae.ObjectStateManager.ChangeObjectState(slot, EntityState.Modified);
    ae.SaveChanges();
}

问题可能在于我正在对相关实体执行操作。 (预约患者有预约,每个患者都有患者等循环参考)