我运行此查询以使用实体框架和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秒钟。
答案 0 :(得分:1)
您似乎没有销毁您的Context / Repository,如果您的存储库在整个应用程序范围内保持活动状态,它的大小将会增加。这是不好的做法,通常存储库应该只与请求生命周期一起生存,它应该在新请求启动时创建,并在请求完成时处理。