环境 实体框架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
属性配置如下:
Concurrency
:StoreGeneratedPattern
Computed
:Concurrency 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
令人困惑的是,我添加了另一种使用相同方法的方法(获取 - 更新某些字段 - 保存回来),这不会导致异常,因此问题必须更高。也许正在举行一些参考。
答案 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();
}
问题可能在于我正在对相关实体执行操作。 (预约患者有预约,每个患者都有患者等循环参考)