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

标签 c# asp.net entity-framework asp.net-web-api bulkinsert

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

注意:上传Aircraft-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);
            }
        }
    }
}

最佳答案

只需使用 block 从 MemoryStream 中删除 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);

关于c# - EF BulkInsert 未在 Task.Run() 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58062167/

相关文章:

c# - 如何使用 Application_UnhandledException 捕获一般异常?

c# - 反序列化 JSON 结构

asp.net - ASP.NET MVC 3 应用程序中每个浏览器选项卡/窗口的新 session

entity-framework - 如何使用 Entity Framework 在Sql Server Express中获取下一个序列号?

c# - 我应该如何依赖 Session

asp.net - 为什么request.rawurl不包含http ://localhost part?

asp.net - 找不到 'aspnetcorev2_inprocess.dll' 。异常消息

c# - 正确使用 Entity Framework 事务进行隔离

c# - 在 C# 中从 Entity Framework 调用存储过程

C# 解析问题