Entity framework 6 在上一个异步操作完成同步asp.net标识调用中的错误之前,在此上下文上启动了第二个操作
我越来越 “在上一个操作之前,在此上下文上启动了第二个操作 异步操作已完成“ 使用asp.net identity 2.1的MVC项目中出现间歇性错误。基本上,我有一个基础控制器,其他控制器都是从这个基础控制器派生的,这个控制器有一个返回ApplicationUser的属性。(asp.net标识用户的扩展类)。基本控制器具有以下功能。注意,UserManager是从OwinContext中检索的(是的,它是使用 CreatePerOwinContext() 方法,就像在模板中一样Entity framework 6 在上一个异步操作完成同步asp.net标识调用中的错误之前,在此上下文上启动了第二个操作,entity-framework-6,asp.net-identity-2,Entity Framework 6,Asp.net Identity 2,我越来越 “在上一个操作之前,在此上下文上启动了第二个操作 异步操作已完成“ 使用asp.net identity 2.1的MVC项目中出现间歇性错误。基本上,我有一个基础控制器,其他控制器都是从这个基础控制器派生的,这个控制器有一个返回ApplicationUser的属性。(asp.net标识用户的扩展类)。基本控制器具有以下功能。注意,UserManager是从OwinContext中检索的(是的,它是使用 CreatePerOwinContext() 方法,就像在模板中一样 protect
protected ApplicationUser ApplicationUser
{
get
{
var userId = User.Identity.GetUserId();
var applicationUser = UserManager.FindById(userId);
if (applicationUser == null)
{
return null;
}
return applicationUser;
}
}
protected ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}
这有时有效,有时会出现我提到的错误。我没有在属性或控制器方法中调用异步操作。因此我感到困惑。有什么想法吗?我怀疑这行代码:
OrganizationDetailViewModels = ApplicationUser.Affiliations
.Select(e => new OrganizationDetailViewModel(
e.Organization, ApplicationUser)).ToList()
在这里,您对应用程序用户
进行请求,然后延迟加载附属机构
,然后对附属机构
中的每个选择再次对应用程序用户
进行请求
对ApplicationUser
执行本地缓存,以避免在只需要一个数据库的情况下向数据库发出多个请求:
private ApplicationUser _cachedUser;
protected ApplicationUser ApplicationUser
{
get
{
var userId = User.Identity.GetUserId();
if (_cachedUser == null)
{
var applicationUser = UserManager.FindById(userId);
return applicationUser;
}
return _cachedUser;
}
}
谢谢!我不敢相信我错过了缓存实现。它确实避免了对FindById()的调用在同一个请求中,因此我没有再收到错误。但是,我仍然对错误感到惊讶。调用堆栈中根本没有异步操作,因此不知道为什么它会抱怨异步操作。性能很差,但提到了“以前的异步操作”其中的错误仍然令人费解。如果您有任何输入,我很想听听。感谢您的响应实体默认使用异步操作。您使用的sync
FindById
来自一个扩展,该扩展只将异步调用包装到sync包装器中。而异常来自EF DbContext,它检查多个异步操作.Som沿着这条线走。
private ApplicationUser _cachedUser;
protected ApplicationUser ApplicationUser
{
get
{
var userId = User.Identity.GetUserId();
if (_cachedUser == null)
{
var applicationUser = UserManager.FindById(userId);
return applicationUser;
}
return _cachedUser;
}
}