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);
我在 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);