Entity framework 6 在上一个异步操作完成同步asp.net标识调用中的错误之前,在此上下文上启动了第二个操作

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

我越来越

“在上一个操作之前,在此上下文上启动了第二个操作 异步操作已完成“

使用asp.net identity 2.1的MVC项目中出现间歇性错误。基本上,我有一个基础控制器,其他控制器都是从这个基础控制器派生的,这个控制器有一个返回ApplicationUser的属性。(asp.net标识用户的扩展类)。基本控制器具有以下功能。注意,UserManager是从OwinContext中检索的(是的,它是使用

CreatePerOwinContext()

方法,就像在模板中一样

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;
    }
}