我有一个页面对Web Api
方法进行2次ajax调用,该方法执行以下逻辑:
代码:
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个项目。
答案 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:)