sql server-返回LINQ旧数据



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

我需要返回的数据与数据库中的数据相匹配,但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

如果没有,请解释之间的区别

idnewIdoldIddata.iddata.dataId

相关内容

  • 没有找到相关文章

最新更新