Как устранить ошибку Вторая операция началась в этом контексте до завершения предыдущей операции - PullRequest
0 голосов
/ 15 февраля 2020

Я реализую 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.

Буду признателен, если кто-нибудь скажет мне, где я могу ошибиться?

1 Ответ

1 голос
/ 18 февраля 2020

Если вы нажмете на ссылку из сообщения об исключении: https://go.microsoft.com/fwlink/?linkid=2097913, это будет просто:

Entity Framework Core не поддерживает несколько параллельных операций, выполняемых на тот же DbContext экземпляр. Это включает в себя как параллельное выполнение async запросов, так и любое явное параллельное использование из нескольких потоков. Поэтому всегда ожидайте немедленных асинхронных вызовов c или используйте отдельные экземпляры DbContext для операций, которые выполняются параллельно.

Если вы проверите свой метод APIApplicantHistoryLog, вы не awaiting ваш _context.SaveChangesAsync(); вызов метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...