LINQ旧数据被返回

时间:2011-06-07 00:58:27

标签: sql-server linq entity-framework

我没有在微软的论坛上找到任何地方。对一个用户有用的东西对我不起作用,所以我一定做错了。

我需要返回的数据与数据库中的内容相匹配,但是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代码返回旧数据(我有时间戳)。我开始认为问题是这些变化实际上并没有被保存,或者是某种缓存问题。

更新: 我想我可能知道为什么......进行一些测试。

2 个答案:

答案 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

如果没有请解释

之间的区别

idnewIdoldIddata.iddata.dataId