我在微软论坛上没有找到任何位置。对一个用户有效的东西对我不起作用,所以我一定做错了什么。
我需要返回的数据与数据库中的数据相匹配,但6秒钟后,它会返回为刚刚更新的前一个数据。我正在该方法中创建上下文,并使用StoreWins,但可能使用错误。
下面是一个示例方法。
public bool MyExampleMethod(long id, long newId, long oldId)
{
using (var context = new myEntity())
{
my_table data = (from d in context.my_table
where d.id == id
select d).FirstOrDefault();
context.Refresh(System.Data.Objects.RefreshMode.StoreWins, data);
if (data.dataId != oldId) { return false; }
data.dataId = newId;
context.SaveChanges();
return true;
}
}
我也有一些带时间戳的登录,因为我会跟踪旧ID。我看到(不止一次)6秒钟后,方法再次使用错误的(旧的oldId)调用,并且返回的行是旧的oldId,而不是以前设置的newId。这是不可能的,因为dataId已更改为newId并已保存。newId永远不会匹配oldId,我已经验证了这不会发生。这个问题是随机发生的。99%的情况下,它都很好,但当它返回旧数据时,它会创建很多我必须手动修复的坏数据。
我应该根据上下文做点什么吗。保存更改()?还是我使用StoreWins不正确?
更多信息:
id:主键/标识列。
newId:这是更新行的人员的用户Id
旧ID:这是上次更新行的人的用户id
在更新之前,我需要确保行没有被其他人更改。最初我在LINQ代码中有oldId,但在试图找出旧数据返回的原因时更改了它。
关键是,如果其他人更改了该行,并且该行已经被其他人更改,我需要通知用户。
今天我看到16秒后LINQ代码返回了旧数据(我有时间戳)。我开始认为问题是更改有时并没有被保存,或者是某种缓存问题。
更新:我想我可能知道为什么。。运行一些测试。
我从未见过你这样做。通常你会在try块中尝试保存。如果它由于并发异常而失败,则在catch块中执行context.refresh;
try
{
int num = context.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
context.Refresh(RefreshMode.ClientWins, data);
context.SaveChanges();
}
这一行让我很困惑:
where d.id == id
应该是吗
where d.dataId == id
如果没有,请解释之间的区别
id
、newId
、oldId
、data.id
和data.dataId