EF BulkInsert 未在 Task.Run() 中触发

EF BulkInsert is not triggering in Task.Run()

我在 Task.Run(() => AircraftManager.UploadAircraft(fileContent)); 中调用一个方法,在我正在执行的方法中 BulkInsert() 但它没有在数据库中添加记录。但是,如果我 运行 没有 Task.Run() 它工作完美,但需要更长的时间。

注意:正在上传飞机-2019.csv 包含超过 22,000 条记录。

这是我的代码

Controller.cs

[HttpPost]
        public IHttpActionResult UploadAircraft()
        {
            //If the request contains multipart/form-data.  
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            var provider = currentRequest.Value.Content.ReadAsMultipartAsync(new Classes.Mach.AuthorizationServer.API.Providers.MultipartFormDataStreamProvider()).Result;
            IList<HttpContent> receivedfiles = provider.Files;

            //Upload multiple files
            List<FileUploadResult> uploadResults = new List<FileUploadResult>();
            foreach (HttpContent file in receivedfiles)
            {
                var receivedFileName = file.Headers.ContentDisposition.FileName.Trim('\"');
                var receivedkey = file.Headers.ContentDisposition.Name.Trim('\"');

                byte[] fileContent = file.ReadAsByteArrayAsync().Result;

                Task.Run(() => AircraftManager.UploadAircraft(receivedkey, receivedFileName, fileContent));

            }
            return Ok(new ApiResponse(true, "Files uploaded successfully", uploadResults));
        }

AircraftManager.cs

public void UploadAircraft(string documentType, string filename, byte[] content)
{
   if (filename.ToLower().EndsWith("csv"))
    {
        using (MemoryStream stream = new MemoryStream(content))
        {
            using (CsvReader csvReader = new CsvReader(new StreamReader(stream), true))
            {
                var records = csvReader.GetRecords<AircraftDTO>();
                List<Aircraft> aircraftList = new List<Aircraft>();
                foreach (var item in records )
                {
                    Aircraft aircraft = new Aircraft();

                    aircraft.BusinessName = item.BusinessName;
                    aircraft.IssuingCountry = item.IssuingCountry;
                    aircraft.CertificateCode = item.CertificateCode;
                    aircraft.CertificateHolderName = item.CertificateHolderName;
                    aircraft.Tailnumber = item.Tailnumber;
                    aircraft.SerialNumber = item.SerialNumber;
                    aircraft.YearMade = !string.IsNullOrWhiteSpace(item.YearMade) && item.YearMade != "NULL" ? Convert.ToInt32(item.YearMade) : (int?)null;
                    aircraft.Manufacturer = item.Manufacturer

                    aircraftList.Add(wyvernAircraft);
                }
               dbContext.Aircraft.BulkInsert(aircraftList);
            }
        }
    }
}

只需从 MemoryStream using 块中删除 dbContext 调用,并将 dbContext.Aircraft.BulkInsert(aircraftList) 替换为 dbContext.BulkInsert(aircraftList),如下所示:


    List<Aircraft> aircraftList = new List<Aircraft>();
        using (MemoryStream stream = new MemoryStream(content))
        {
                using (CsvReader csvReader = new CsvReader(new StreamReader(stream), true))
                {
                    var records = csvReader.GetRecords<AircraftDTO>();

                    foreach (var item in records )
                    {
                        Aircraft aircraft = new Aircraft();

                        aircraft.BusinessName = item.BusinessName;
                        aircraft.IssuingCountry = item.IssuingCountry;
                        aircraft.CertificateCode = item.CertificateCode;
                        aircraft.CertificateHolderName = item.CertificateHolderName;
                        aircraft.Tailnumber = item.Tailnumber;
                        aircraft.SerialNumber = item.SerialNumber;
                        aircraft.YearMade = !string.IsNullOrWhiteSpace(item.YearMade) && item.YearMade != "NULL" ? Convert.ToInt32(item.YearMade) : (int?)null;
                        aircraft.Manufacturer = item.Manufacturer

                        aircraftList.Add(wyvernAircraft);
                    }
                }
        }
        dbContext.BulkInsert(aircraftList);