用户管理器CreateAsync运行速度非常慢 - 身份2

时间:2015-05-08 13:34:31

标签: c# asp.net-mvc-5 entity-framework-6 asp.net-identity-2

我运行此查询以使用实体框架和Microsoft身份2将旧MySQL数据库中的使用导入新SQL数据库,并在本地服务器上将Visual Studio社区版本与SQL Server 10.0一起运行。 5

用户经理声明

private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
    get
    {
        if (_userManager == null)
        {
            this._userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
            this._userManager.PasswordValidator = new CustomPasswordValidator();
        }
        return _userManager;
    }
    private set
    {
        _userManager = value;
    }
}

控制器方法 - sql和MySQL工作单元在控制器构造中,每个数据库只有1个上下文用于整个过程

public async Task<ActionResult> Index()
{
    await ImportUsers();

    return View();
}

private async Task<bool> ImportUsers()
{
    DateTime timeNow = DateTime.Now;

    // Returns a full list of old users in about a millisecond
    List<default_users> users = 
        this.mySQLUnitOfWork
        .MySQLRepo
        .GetUsers()
        .ToList(); 

    foreach (var user in users)
    {                  
        if (user.username != null && user.email != null &&
            user.username != "" && user.email != "" &&
            UserManager.FindByEmail(user.email) == null)
        {
            default_profiles profile = 
                this.mySQLUnitOfWork
                    .MySQLRepo
                    .GetProfiles()
                    .Where(x => 
                        x.id == user.id
                    ).FirstOrDefault();

            if (profile != null)
            {          
                var newUser = new ApplicationUser { 
                    UserName = user.username.ToLower(), 
                    Email = user.email.ToLower(), 
                    CreatedAt = timeNow, 
                    UpdatedAt = timeNow 
                };

                newUser.Profile = new UserProfile { 
                    CreatedAt = timeNow, 
                    UpdatedAt = timeNow, 
                    FirstName = profile.first_name, 
                    LastName = profile.last_name, 
                    User = newUser 
                };

                // Takes ages to complete
                var result = await UserManager.CreateAsync(
                    newUser, 
                    Guid.NewGuid().ToString("N")
                );

                if (result.Succeeded)
                {
                    UserManager.AddToRole(newUser.Id, RoleChoices.MEMBER);             
                    var dbUser = this.sqlUnitOfWork.UserRepository.GetByID(newUser.Id);
                }
            }
        }
    }

    return true;
}

问题:

对于2000个用户记录 ,此操作至少需要45分钟。似乎CreateAsync和AddToRole方法需要绝对年龄才能运行。这可能是什么原因?

注意:

我一直在调试这个死...最慢的部分是等待CreateAsync方法完成......它真的很奇怪?创建用户至少需要1秒钟。

1 个答案:

答案 0 :(得分:1)

您似乎没有销毁您的Context / Repository,如果您的存储库在整个应用程序范围内保持活动状态,它的大小将会增加。这是不好的做法,通常存储库应该只与请求生命周期一起生存,它应该在新请求启动时创建,并在请求完成时处理。