[ad_1]
私はasp.netコアプロジェクトを実装しています。 私のコントローラークラスでは、メソッドを作成します。最初にテーブルAPIApplicantHistoryにログ履歴としてレコードを挿入し、値を取得するためにいくつかの計算を行い、その後createメソッドに戻り、新しいレコードを作成して挿入しますAPIApplicant テーブルに。 そのために、以下のようなコードを書きました。
私の問題は、アプリケーションを実行して APIApplicant で新しいレコードを作成した後、次のエラーが表示されることです。
リクエストの処理中に未処理の例外が発生しました。 InvalidOperationException: 前の操作が完了する前に、このコンテキストで 2 番目の操作が開始されました。 これは通常、異なるスレッドが DbContext の同じインスタンスを使用していることが原因です。 DbContext でのスレッドの問題を回避する方法の詳細については、https://go.microsoft.com/fwlink/?linkid=2097913 を参照してください。
どこで間違いを犯すのか教えていただければ幸いです。
私が試したこと:
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)); } 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(); ; } } }
解決策 1
あなたのアプローチ全体が「混乱」しているように見えます。
コンストラクターに dbContext を渡し、コードの本文で他のものを作成します。
dbContext は「軽量」で作成が高速であり、その有効期間は「短い」必要があります。 「それらを渡す」ことは無意味であり、おそらくメソッドのコードと競合します。
[ad_2]
コメント