Web Api并发问题检查项是否存在

时间:2016-06-28 02:58:38

标签: c# ajax entity-framework concurrency

我有一个页面对Web Api方法进行2次ajax调用,该方法执行以下逻辑:

  1. 检查项目是否存在。如果是,请检索该项目。
  2. 如果项目不存在,请创建它。
  3. 代码:

    if (!_db.Items.Any(x => x.EntityId == requestItem.EntityId &&                            
                                x.UserId == request.UserId))
    {
        // item does not exist, so create it.
        var item = new Item(); 
        // set some properties here...
    
        _db.Items.Add(item);
    }
    

    我遇到的问题是项目的创建速度非常快,而且由于ajax调用同时运行,我最终得到了两个项目。但我只想允许创建1。我不想向用户抛出错误。我希望只有在真正不存在的情况下才能创建项目。我怎样才能做到这一点?

    我在使用Entity Framework设置并发检查时看到了post,但我不想向用户发回错误,所以我不确定设置EF并发是什么我需要去做。价值观不会互相覆盖。两次调用都在(接近)同时发生,因此两者都看到表中有0个项目。

1 个答案:

答案 0 :(得分:0)

您必须在请求中设置唯一标识符才能确定服务器上的双重发布。

我建议在页面加载时生成UID。 当用户单击将请求发送到Web api的按钮时,传递生成的UID。

现在,如果用户多次点击该按钮,它仍将为UID传递相同的值,因为它是在页面加载时生成的,而不是在用户点击时生成的。

在服务器上,执行相同的检查。

if (!_db.Items.Any(x => x.EntityId == requestItem.EntityId &&                            
                            x.UserId == request.UserId))
{
    // item does not exist, so create it.
    var item = new Item(); 
    // set some properties here...

    _db.Items.Add(item);
}

我建议将请求中的UID用作requestItem.EntityId

无需添加try-catch块,因为您使用的是足够的简单if语句。您最好找到生成代码或库的javascript UUID:)