我没有在微软的论坛上找到任何地方。对一个用户有用的东西对我不起作用,所以我一定做错了。
我需要返回的数据与数据库中的内容相匹配,但是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;
}
}
我在那里有一些登录以及时间戳,因为我跟踪oldId。我已经看过(不止一次)6秒钟之后,该方法再次使用错误(old oldId)调用,并且该行返回旧oldId而不是之前设置的newId。这是不可能的,因为dataId已更改为newId并已保存。 newId永远不会与oldId匹配,我已经证实这不会发生。这个问题是随机发生的。 99%的时间没问题,但是当它返回旧数据时,会产生大量不良数据,我必须手动修复。
我应该在context.SaveChanges()之后做些什么吗?或者我是否错误地使用了StoreWins?
更多信息:
ID: 主键/标识列。
NEWID: 这是更新行的人员的用户ID
OLDID: 这是上次更新行的人员的用户ID
在更新之前,我需要确保其他人没有更改该行。最初我在LINQ代码中使用了oldId,但在尝试找出旧数据回来的原因时对其进行了更改。
重点是,如果其他人更改了该行,并且我已经被其他人更改了,我需要通知该用户。
今天我看到16秒后LINQ代码返回旧数据(我有时间戳)。我开始认为问题是这些变化实际上并没有被保存,或者是某种缓存问题。
更新: 我想我可能知道为什么......进行一些测试。
答案 0 :(得分:0)
我从未见过你这样做的方式。通常,您尝试在try块中进行保存。如果由于并发异常而失败,那么你在catch块中执行context.refresh;
try
{
int num = context.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
context.Refresh(RefreshMode.ClientWins, data);
context.SaveChanges();
}
答案 1 :(得分:0)
这句话让我感到困惑:
where d.id == id
应该是
where d.dataId == id
如果没有请解释
之间的区别 id
,newId
,oldId
,data.id
和data.dataId