c# - 如何解决错误在前一个操作完成之前在此上下文上启动了第二个操作
问题描述
我正在实施 asp.net 核心项目。在我的控制器类中,创建方法,首先我在表 APIApplicantHistory 中插入一条记录作为日志历史记录,然后我进行一些计算以获取一个值,然后我返回到 create 方法并创建一条新记录并插入它进入 APIApplicant 表。为此,我编写了如下代码:
namespace CSDDashboard.Controllers
{
public class ApiapplicantsController : Controller
{
private readonly CSSDDashboardContext _context;
public ApiapplicantsController(CSSDDashboardContext context)
{
_context = context;
}
public async Task<IActionResult> Create([Bind("Id,ApiRequestDate,ApiRequestNo,Apiid,ApplicantId,GateId,LastRequestStatus,NocRequestDate,NocRequestNo,Url,Description,IsDeleted")] Apiapplicant apiapplicant)
{
ApiApplicantDto dto = new ApiApplicantDto();
if (ModelState.IsValid)
{
// Apiapplicant myapiapplicant = _context.Apiapplicant.LastOrDefault<Apiapplicant>();
Apiapplicant myapiapplicant = _context.Apiapplicant.ToArray().Last();
int temp = myapiapplicant.Id + 1;
int calcApiApplicantHistoryId = APIApplicantHistoryLog(temp);
var api = _context.Api.Single(p => p.Id == apiapplicant.Apiid);
var gate = _context.Gate.Single(p => p.Id == apiapplicant.GateId);
var applicant = _context.Applicant.Single(p => p.ApplicantId == apiapplicant.ApplicantId);
//var apiapplicanthistory = _context.ApiApplicantHistory.Single(p => p.Id == apiapplicant.LastRequestStatus);
dto.apiId = api.Id;
dto.gateId = gate.Id;
dto.applicantId = applicant.ApplicantId;
using (var _context = new CSSDDashboardContext())
{
_context.Set<Apiapplicant>().Add(new Apiapplicant
{
Apiid = dto.apiId,
GateId = dto.gateId,
ApplicantId = dto.applicantId,
LastRequestStatus = calcApiApplicantHistoryId,
ApiRequestDate = apiapplicant.ApiRequestDate,
ApiRequestNo = apiapplicant.ApiRequestNo,
NocRequestDate = apiapplicant.NocRequestDate,
NocRequestNo = apiapplicant.NocRequestNo,
Url = apiapplicant.Url,
Description = apiapplicant.Description,
IsDeleted = false
});
await _context.SaveChangesAsync();
};
return RedirectToAction(nameof(Index));
}
ViewData["Apiid"] = new SelectList(_context.Api, "Id", "Name", apiapplicant.Apiid);
ViewData["ApplicantId"] = new SelectList(_context.Applicant, "ApplicantId", "Name", apiapplicant.ApplicantId);
ViewData["GateId"] = new SelectList(_context.Gate, "Id", "Name", apiapplicant.GateId);
ViewData["sentResponseType"] = new SelectList(_context.EntityType.Where(g => g.EntityKey=="sentResponseType").ToList(), "ID", "name", apiapplicant.LastRequestStatusNavigation.SentResponseType);
ViewData["unconfirmedReason"] = new SelectList(_context.EntityType.Where(g => g.EntityKey == "unconfirmedReason").ToList(), "Id", "name", apiapplicant.LastRequestStatusNavigation.UnconfirmedReason);
ViewData["lastReqStatus"] = new SelectList(_context.EntityType.Where(g => g.EntityKey == "lastRequestStatus").ToList(), "Id", "name", apiapplicant.LastRequestStatusNavigation.LastReqStatus);
return View(apiapplicant);
}
private int APIApplicantHistoryLog(int myAPIApplicantId)
{
APIApplicantHistoryDto mydto = new APIApplicantHistoryDto();
// var apiapplicantt = _context.ApiApplicantHistory.Single(p => p.ApiApplicantId == myAPIApplicantId);
// mydto.APIApplicantHistoryId = apiapplicantt.Id;
using (var _context = new CSSDDashboardContext())
// using (var transaction = _context.Database.BeginTransaction())
{
_context.Set<ApiApplicantHistory>().Add(new ApiApplicantHistory
{
// ApiApplicantId = mydto.APIApplicantHistoryId,
ApiApplicantId = myAPIApplicantId,
Date = null,
SentResponseType = 0,
UnconfirmedReason = 0,
LastReqStatus = 0,
Description = "",
IdDeleted = false // This field should be totally omited from SQL server
}) ;
_context.SaveChangesAsync();
var myArrayList = new List<int>();
var result = from x in _context.ApiApplicantHistory where x.ApiApplicantId == myAPIApplicantId
select new { x.Id };
foreach (var i in result)
myArrayList.Add(i.Id);
return myArrayList.Max(); ;
}
}
}
我的问题是,在运行应用程序并在 APIApplicant 中创建新记录后,向我显示以下错误:
处理请求时发生未处理的异常。InvalidOperationException:在前一个操作完成之前在此上下文上启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。有关如何避免 DbContext 线程问题的更多信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2097913。
如果有人告诉我我在哪里犯了错误,我将不胜感激?
解决方案
如果您单击异常消息中的链接:https ://go.microsoft.com/fwlink/?linkid=2097913 ,这似乎很简单:
Entity Framework Core 不支持在同一
DbContext
实例上运行多个并行操作。这包括async
查询的并行执行和来自多个线程的任何显式并发使用。因此,请始终立即等待异步调用,或者DbContext
对并行执行的操作使用单独的实例。
如果你检查你的APIApplicantHistoryLog
方法,你就不是awaiting
你的_context.SaveChangesAsync();
方法调用。
推荐阅读
- whitespace - 如何删除文件名前面的空格,同时在 Windows 10 的 3000 个文件中保留其他空格
- react-native - 在同一个文件中包含太多导入是否会减慢应用程序的本机反应
- csv - 多个 pcap 文件到 csv 文件
- mongodb - 无法从 MongoDB shell 连接到类 Atlas 集群
- jquery - 使用 JQuery 在 Html 表中添加新列
- python - 神经网络中 2 个隐藏层的反向传播和前向传播
- android - RadioGroup - 为什么选择每个单选按钮后按钮没有改变颜色
- javascript - 如何根据 Javascript 中的多个键对对象数组进行分组?
- python-3.x - 为什么这些线程不能同时工作?
- tensorflow - 如何为二维数据构建 LSTM 网络?