首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同时多次调用同一url时锁定EF 6 insert

同时多次调用同一url时锁定EF 6 insert
EN

Stack Overflow用户
提问于 2016-07-15 15:17:37
回答 2查看 130关注 0票数 1

我有一个ASP.NET MVC6应用程序。当用户在Angular中进入客户端时,我会调用ASP.NET的异步Api,在某些地方,我会调用Api 3-4次来获取其他资源。

我还在我的数据库中保留了一个用户表,与EF 6连接。在这里,当输入的用户(使用Windows Auth)不存在时,我创建一个新的用户行,并为他添加‘Public’-角色。

然而,当用户首先进入调用Api 3-4次的页面时,用户被创建了3-4次,因为“Create”没有锁定表,从而创建了用户3次。

我如何锁定表(在我的例子中是存储库),让下一次调用等待锁被移除,然后执行'GetAsync‘来检查用户是否存在?

被调用3次的代码:

代码语言:javascript
运行
复制
        var currentUserName = User.Identity.Name;
        var currentUser = await _userRepository.GetAsync(u => u.UserName == currentUserName);

        // Create user that does not yet exist
        if (currentUser != null) return HttpBadRequest();

        var user = new User(currentUserName);

        using(new CreatedBySystemProvider(_userRepository))
        {
            _userRepository.Add(user);
            await _userRepository.SaveChangesAsync();
            await user.AddRoleAsync(AppSumRoles.Authenticated);
            /* Temporary add SysAdmin role */
            if(string.Equals(currentUserName, @"BIJTJES\NilsG", StringComparison.CurrentCultureIgnoreCase))
            {
                using(new CreatedBySystemProvider(_userRoleRepository))
                {
                    await user.AddRoleAsync(AppSumRoles.SysAdmin);
                }
            }
            currentUser = await _userRepository.GetAsync(u => u.Id == user.Id);
        }

        return Ok(currentUser);
EN

回答 2

Stack Overflow用户

发布于 2016-07-15 17:11:11

考虑将CreateUser代码移到单独的应用程序接口中。用户创建应该是一个单独的用例,而不是每个其他用例的隐含部分。不要混为一谈。

票数 0
EN

Stack Overflow用户

发布于 2016-07-15 19:26:24

你应该考虑重构你的用户创建过程。但是对于你的问题,你可以这样做

(详情请参阅http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx)

代码语言:javascript
运行
复制
private static readonly AsyncLock asyncLocker = new AsyncLock(); 

var currentUserName = User.Identity.Name;

using(var releaser = await asyncLocker.LockAsync()) 
{
    var currentUser = await _userRepository.GetAsync(u => u.UserName == currentUserName);

    // Create user that does not yet exist
    if (currentUser != null) return HttpBadRequest();

    var user = new User(currentUserName);

    using(new CreatedBySystemProvider(_userRepository))
    {
        _userRepository.Add(user);
        await _userRepository.SaveChangesAsync();
        await user.AddRoleAsync(AppSumRoles.Authenticated);
        /* Temporary add SysAdmin role */
        if(string.Equals(currentUserName, @"BIJTJES\NilsG", StringComparison.CurrentCultureIgnoreCase))
        {
            using(new CreatedBySystemProvider(_userRoleRepository))
            {
                await user.AddRoleAsync(AppSumRoles.SysAdmin);
            }
        }
        currentUser = await _userRepository.GetAsync(u => u.Id == user.Id);
    }
}

return Ok(currentUser);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38390073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档