Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在上一个操作完成Asp.net EF Core之前,在此上下文上启动了第二个操作_C#_Entity Framework_Asp.net Core - Fatal编程技术网

C# 在上一个操作完成Asp.net EF Core之前,在此上下文上启动了第二个操作

C# 在上一个操作完成Asp.net EF Core之前,在此上下文上启动了第二个操作,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我有一个小问题,我一直得到我在使用一个页面上的视图组件,我一直得到以下。我正在使用asp.net core 3.1和ef core 3.1 处理请求时数据库操作失败。 InvalidOperationException:在此上下文上启动了第二个操作 在上一个操作完成之前。这通常是由于 使用同一DbContext实例的不同线程。更多 有关如何避免DbContext线程问题的信息,请参阅 . 还有待解决的问题 在VisualStudio中,为MISDBContext更改模型,请使用包 Manager

我有一个小问题,我一直得到我在使用一个页面上的视图组件,我一直得到以下。我正在使用asp.net core 3.1和ef core 3.1

处理请求时数据库操作失败。 InvalidOperationException:在此上下文上启动了第二个操作 在上一个操作完成之前。这通常是由于 使用同一DbContext实例的不同线程。更多 有关如何避免DbContext线程问题的信息,请参阅 . 还有待解决的问题 在VisualStudio中,为MISDBContext更改模型,请使用包 Manager控制台为这些更改和更改构建新的迁移框架 将它们应用于数据库:

PM>添加迁移[迁移名称]PM>或者更新数据库, 您可以在以下位置构建新迁移并从命令提示符应用它: 您的项目目录:

dotnet ef迁移添加[迁移名称] dotnet ef数据库更新

我已经检查过了,它建议你现在在你的课堂上添加以下内容,我是对的,我认为我根本不需要第二个上下文,这就是在我的案例中导致问题的原因。我加了一行

ServiceLifetime.Transient
显然,上面这一行允许更多的并发连接到上下文

services.AddDbContext<MISDBContext>
 (options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);

services.AddDbContext<ApplicationDbContext>(options =>
 options.UseSqlServer(
 Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);            
 private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
    public async Task<Guid> GetCurrentTennantId() {
        ApplicationUser usr = await GetCurrentUserAsync();
        TempData["TeannantId"] = usr?.Id;
        Guid.TryParse(usr?.Id, out Guid resultTennantId);
        return resultTennantId;
    }
    private Task<List<ApplicationUser>> GetItemsAsync() {
        string currentUser =  GetCurrentTennantId().Result.ToString();
        var excludeCurrentUser= _userManager.Users.Where(w => w.Id != currentUser).ToListAsync();
        return excludeCurrentUser;
    }
}
services.AddDbContext
(options=>options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”))、ServiceLifetime.Transient);
services.AddDbContext(选项=>
options.UseSqlServer(
GetConnectionString(“DefaultConnection”)、ServiceLifetime.Transient);
这是我的视图组件的典型布局,我认为事实上可能是这个布局导致了问题,因为我试图在访问上下文的同时访问用户存储

services.AddDbContext<MISDBContext>
 (options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);

services.AddDbContext<ApplicationDbContext>(options =>
 options.UseSqlServer(
 Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);            
 private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
    public async Task<Guid> GetCurrentTennantId() {
        ApplicationUser usr = await GetCurrentUserAsync();
        TempData["TeannantId"] = usr?.Id;
        Guid.TryParse(usr?.Id, out Guid resultTennantId);
        return resultTennantId;
    }
    private Task<List<ApplicationUser>> GetItemsAsync() {
        string currentUser =  GetCurrentTennantId().Result.ToString();
        var excludeCurrentUser= _userManager.Users.Where(w => w.Id != currentUser).ToListAsync();
        return excludeCurrentUser;
    }
}
private Task GetCurrentUserAsync()=>\u userManager.GetUserAsync(HttpContext.User);
公共异步任务GetCurrentTennAnti(){
ApplicationUser usr=等待GetCurrentUserAsync();
TempData[“TeannantId”]=usr?.Id;
Guid.TryParse(usr?.Id,out Guid resulttenntid);
返回resulttenntid;
}
私有任务GetItemsAsync(){
字符串currentUser=GetCurrentTennId().Result.ToString();
var excludeCurrentUser=_userManager.Users.Where(w=>w.Id!=currentUser.toListSync();
返回excludeCurrentUser;
}
}
显然,上面这一行允许更多的并发连接到上下文

services.AddDbContext<MISDBContext>
 (options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);

services.AddDbContext<ApplicationDbContext>(options =>
 options.UseSqlServer(
 Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);            
 private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
    public async Task<Guid> GetCurrentTennantId() {
        ApplicationUser usr = await GetCurrentUserAsync();
        TempData["TeannantId"] = usr?.Id;
        Guid.TryParse(usr?.Id, out Guid resultTennantId);
        return resultTennantId;
    }
    private Task<List<ApplicationUser>> GetItemsAsync() {
        string currentUser =  GetCurrentTennantId().Result.ToString();
        var excludeCurrentUser= _userManager.Users.Where(w => w.Id != currentUser).ToListAsync();
        return excludeCurrentUser;
    }
}
没有;它为每个请求创建一个新的上下文。每个上下文一次只能用于一个操作。因此,例如,如果您的上下文以前是单例的,那么一次只能有一个HTTP请求进行操作

我认为事实上,可能是这个问题导致了我试图在访问上下文的同时访问用户存储

services.AddDbContext<MISDBContext>
 (options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);

services.AddDbContext<ApplicationDbContext>(options =>
 options.UseSqlServer(
 Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);            
 private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
    public async Task<Guid> GetCurrentTennantId() {
        ApplicationUser usr = await GetCurrentUserAsync();
        TempData["TeannantId"] = usr?.Id;
        Guid.TryParse(usr?.Id, out Guid resultTennantId);
        return resultTennantId;
    }
    private Task<List<ApplicationUser>> GetItemsAsync() {
        string currentUser =  GetCurrentTennantId().Result.ToString();
        var excludeCurrentUser= _userManager.Users.Where(w => w.Id != currentUser).ToListAsync();
        return excludeCurrentUser;
    }
}
此代码本身不会导致问题,但如果此模式在代码库中重复,则可能导致问题

总之。例如,
GetCurrentUserAsync
很简单(它只是传递到另一个方法),因此可以在那里省略
async
wait
GetItemsAsync
绝对不是微不足道的,因此它应该使用
async
await

private async Task<List<ApplicationUser>> GetItemsAsync() {
  string currentUser = (await GetCurrentTennantId()).ToString();
  return await _userManager.Users.Where(w => w.Id != currentUser).ToListAsync();
}
private异步任务GetItemsAsync(){
字符串currentUser=(等待GetCurrentTennanti()).ToString();
return wait_userManager.Users.Where(w=>w.Id!=currentUser.toListSync();
}

如果在代码库中以类似的方式应用
async
wait
,则应解决并发上下文问题。

哪个DbContext是
\u userManager
使用的?您是否同时使用两个DBContext?另外,对于同一个数据库,您真的需要两个DBContext吗?一些有趣的阅读。它使用了MISDBContext,这是我删除的问题。在我看来,要解决这个问题,您应该确保在调用GetCurrentUserAsync和GetCurrentTennanti方法时始终立即等待异步调用。