Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据迁移脚本在300行之后确实会变慢_C#_Sql Server_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 数据迁移脚本在300行之后确实会变慢

C# 数据迁移脚本在300行之后确实会变慢,c#,sql-server,asp.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,Entity Framework Core,我当前正在将数据从旧的基于MS Infopath的应用程序迁移到asp.net核心应用程序。我已经编写了一个.net控制台应用程序来读取包含旧数据的四个表(tblcreated、tblPDI、tblHistory、tblDekadenplanung、tblAdv),操作一些属性(例如日期)并将其写回新表结构(表车辆文件、交付、客户付款、注释)。由于VehicleFiles持有交货和客户付款数据的外键,因此我必须将它们保存到DB以获取ID,然后将ID存储在VehicleFiles行中,这可能会由于

我当前正在将数据从旧的基于MS Infopath的应用程序迁移到asp.net核心应用程序。我已经编写了一个.net控制台应用程序来读取包含旧数据的四个表(tblcreated、tblPDI、tblHistory、tblDekadenplanung、tblAdv),操作一些属性(例如日期)并将其写回新表结构(表车辆文件、交付、客户付款、注释)。由于VehicleFiles持有交货和客户付款数据的外键,因此我必须将它们保存到DB以获取ID,然后将ID存储在VehicleFiles行中,这可能会由于两个单独的写入过程而导致高负载)。总共有30000行

当我在web服务器上运行迁移应用程序以避免延迟时,它启动得非常快,每秒处理大约20行。但一旦达到300行标志,它就会逐渐开始减速。昨天,在25000点时,处理10行数据大约需要3到4分钟。我只是发布代码,也许有人会发现我的代码中存在明显的缺陷或内存泄漏,并通知我

static void Main(string[] args) {
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

log.InfoFormat("Running as {0}", WindowsIdentity.GetCurrent().Name);

var Configuration = new ConfigurationBuilder().SetBasePath(Path.Combine(AppContext.BaseDirectory)).AddJsonFile("appsettings.json", optional: true).Build();

var serviceProvider = new ServiceCollection().AddDbContext < AutolineContext > ...
// ...Removed bc password

var autolineContext = serviceProvider.GetRequiredService < AutolineContext > ();
var samContext = serviceProvider.GetRequiredService < SAMContext > ();
var luxWebContext = serviceProvider.GetRequiredService < LUX_WEB_SAMContext > ();

var tblCreated = samContext.TblCreated.OrderBy(x = >x.Id).ToList();
var tblPDIAll = samContext.TblPdi.ToList();
var tblHistoryAll = samContext.TblTerminHistorie.ToList();
var tblDekadenplanungAll = samContext.TblDekadenplanung.ToList();
var tblAdvAll = samContext.TblAdV.ToList();

var tblPDI = new TblPdi();
var tblHistory = new TblTerminHistorie();
var tblDekadenplanung = new TblDekadenplanung();
var tblAdv = new TblAdV();

int counter = 0;
var begin = DateTime.Now;
var lastTime = DateTime.Now;
Deliveries delivery = new Deliveries();
CustomerPayments customerPayments = new CustomerPayments();

foreach(var item in tblCreated) {
    counter++;

    if (counter % 10 == 0) {
        Console.WriteLine("\nNächstes Element: " + item.Id + "\nVerarbeitet: " + counter + "\nSekunden seit Beginn: " + (DateTime.Now - begin).TotalSeconds + "\nDauer letzte Zehn: " + (DateTime.Now - lastTime).Seconds);
    }

    VehicleFiles vf = luxWebContext.OrderNumbers.Where(x = >x.CommissionNumber == item.Kommissionsnummer).Select(x = >x.FkVehicleFileNavigation).SingleOrDefault();

    delivery = new Deliveries();
    customerPayments = new CustomerPayments();

    tblPDI = tblPDIAll.SingleOrDefault(x = >x.Kommissionsnummer == item.Kommissionsnummer);
    tblHistory = tblHistoryAll.Where(x = >x.Kommissionsnummer == item.Kommissionsnummer).OrderBy(x = >x.CreationDate).LastOrDefault();
    tblDekadenplanung = tblDekadenplanungAll.SingleOrDefault(x = >x.Kommissionsnummer == item.Kommissionsnummer);
    tblAdv = tblAdvAll.SingleOrDefault(x = >x.Kommissionsnummer == item.Kommissionsnummer);

    // PDI
    delivery.Pdichecker = tblPDI.PdiPruefer;
    delivery.Pdistatus = tblPDI.PdiOk == "OK" ? "1": "";
    if (!string.IsNullOrEmpty(tblPDI.Pdi)) {
        log.Info("Speichere PDI-Datum: " + DateTime.ParseExact(tblPDI.Pdi, "dd/MM/yyyy", CultureInfo.InvariantCulture));
        delivery.Pdidate = DateTime.ParseExact(tblPDI.Pdi, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    }

    DateTime dateValue;
    if (!string.IsNullOrEmpty(tblPDI.ZurReinigung) && DateTime.TryParse(tblPDI.ZurReinigung.Replace("h", ":"), out dateValue)) {
        log.Info("Speichere Reinigung-Datum: " + DateTime.Parse(tblPDI.ZurReinigung.Replace("h", ":")));
        delivery.ForCleaning = DateTime.Parse(tblPDI.ZurReinigung.Replace("h", ":"));
    }

    // Registrierung
    delivery.PlateMounted = tblPDI.Montiert == "OK";
    delivery.RegistrationStatus = tblPDI.AnmeldungOk == "Ok";

    // Auslieferung
    if (tblHistory != null && !string.IsNullOrEmpty(tblHistory.DeliveryDate)) {
        log.Info("Speichere Plan-Delivery-Datum: " + DateTime.Parse(tblHistory.DeliveryDate.Split(" ")[0]));
        delivery.PlanDeliveryDate = DateTime.Parse(tblHistory.DeliveryDate.Split(" ")[0]);
    }

    if (!string.IsNullOrEmpty(item.DatumAuslieferung)) {
        log.Info("Speichere Delivery-Datum: " + DateTime.Parse(item.DatumAuslieferung));
        delivery.DeliveryActual = DateTime.Parse(item.DatumAuslieferung);
    }
    delivery.DeliveryPerson = tblDekadenplanung.Auslieferer;

    if (tblDekadenplanung.Teamleiter != null) delivery.TeamLead = DateTime.Parse(tblDekadenplanung.Teamleiter);

    delivery.CreationDate = DateTime.Now;
    delivery.CreationUser = "MigrationJob";

    // Zahlungsart
    decimal value;
    customerPayments.Value1 = Decimal.TryParse(tblDekadenplanung.Betrag, out value) ? Convert.ToDecimal(tblDekadenplanung.Betrag) : default;
    customerPayments.Value2 = Decimal.TryParse(tblDekadenplanung.Betrag2, out value) ? Convert.ToDecimal(tblDekadenplanung.Betrag2) : default;
    customerPayments.PaymentTyp1 = string.IsNullOrEmpty(customerPayments.PaymentTyp1) ? PaymentMethodConverter(tblDekadenplanung.Zahlungsart) : null;
    customerPayments.PaymentTyp2 = string.IsNullOrEmpty(customerPayments.PaymentTyp2) ? PaymentMethodConverter(tblDekadenplanung.Zahlungsart2) : null;
    customerPayments.CreationDate = DateTime.Now;
    customerPayments.CreationUser = "MigrationJob";
    customerPayments.LastEditedBy = tblDekadenplanung.LastUser;

    if (!string.IsNullOrEmpty(tblDekadenplanung.UpdateDate)) customerPayments.LastEditedDate = DateTime.Parse(tblDekadenplanung.UpdateDate);

    log.Info("Schreibe CreationDate: " + item.Creationdate.Value.ToUniversalTime());
    vf.CreationDate = item.Creationdate.HasValue ? item.Creationdate.Value.ToUniversalTime() : new DateTime();
    vf.CreationUser = item.AnlageUser;
    vf.Active = item.Archive == "False" ? false: true;
    vf.Concluded = item.Abgeschlossen == "Ja" ? true: false;
    vf.ConclusionDate =
default; // Nicht gesetzt im alten SAM

    vf.HolUndBringDauer = item.HolBringDauer != "0" ? Convert.ToInt32(item.HolBringDauer) : default;

    if (delivery.DeliveryActual.HasValue) vf.HolUndBringEnde = delivery.DeliveryActual.Value.AddMonths(Convert.ToInt32(item.HolBringDauer)).AddDays( - 1);

    // Kommentare

    if (!string.IsNullOrEmpty(tblDekadenplanung.KommentarAus) && tblDekadenplanung.KommentarAus != "-") {
        CommentsSam deliveryComment = new CommentsSam {
            FkVehicleFile = vf.PkVehicleFile,
            Comment = tblDekadenplanung.KommentarAus,
            User = "Sys",
            CommentType = "Delivery",
            Date = DateTime.Now
        };
        luxWebContext.Add(deliveryComment);

    }

    if (!string.IsNullOrEmpty(tblPDI.KommentarLog)) {
        CommentsSam pdiComment = new CommentsSam {
            FkVehicleFile = vf.PkVehicleFile,
            Comment = tblPDI.KommentarLog,
            User = "Sys",
            CommentType = "PDI",
            Date = DateTime.Now
        };
        luxWebContext.Add(pdiComment);
    }

    if (!string.IsNullOrEmpty(tblAdv.KommentarZah)) {
        CommentsSam advComment = new CommentsSam {
            FkVehicleFile = vf.PkVehicleFile,
            Comment = tblAdv.KommentarZah,
            User = "Sys",
            CommentType = "ADV",
            Date = DateTime.Now
        };
        luxWebContext.Add(advComment);
    }

    try {
        luxWebContext.Add(delivery);
        luxWebContext.Add(customerPayments);
        luxWebContext.SaveChanges();

        vf.FkDelivery = delivery.PkDelivery;
        vf.FkCustomerPayment = customerPayments.PkCustomerPayment;
        luxWebContext.Update(vf);
        log.Info("Daten erfolgreich geschrieben. VehicleFile-ID: " + vf.PkVehicleFile);
        lastTime = DateTime.Now;

        delivery = null;
        customerPayments = null;
    }
    catch(Exception e) {
        log.Error("Fehler beim Schreiben der Daten: " + e);
    }

}
static void Main(字符串[]args){
var logRepository=LogManager.GetRepository(Assembly.GetEntryAssembly());
Configure(logRepository,新文件信息(“log4net.config”);
InfoFormat(“以{0}运行”,WindowsIdentity.GetCurrent().Name);
var Configuration=new ConfigurationBuilder().SetBasePath(Path.Combine(AppContext.BaseDirectory)).AddJsonFile(“appsettings.json”,可选:true).Build();
var serviceProvider=new servicecolection().AddDbContext。。。
//…已删除bc密码
var autolineContext=serviceProvider.GetRequiredService();
var samContext=serviceProvider.GetRequiredService();
var luxWebContext=serviceProvider.GetRequiredService();
var tblCreated=samContext.tblCreated.OrderBy(x=>x.Id).ToList();
var tblPDIAll=samContext.TblPdi.ToList();
var tblHistoryAll=samContext.TblTerminHistorie.ToList();
var tblDekadenplanungAll=samContext.TblDekadenplanung.ToList();
var tblAdvAll=samContext.TblAdV.ToList();
var tblPDI=新的tblPDI();
var tblHistory=new tblterminhistory();
var tblDekadenplanung=新的tblDekadenplanung();
var tblAdv=新的tblAdv();
int计数器=0;
var begin=DateTime.Now;
var lastTime=DateTime.Now;
交付=新交付();
CustomerPayments CustomerPayments=新CustomerPayments();
foreach(tblCreated中的var项){
计数器++;
如果(计数器%10==0){
Console.WriteLine(“\nNächstes元素:“+item.Id+”\nVerarbeitet:“+counter+”\nSekunden seit Beginn:”+(DateTime.Now-begin).TotalSeconds+”\nDuer letzte Zehn:“+(DateTime.Now-lastTime).Seconds);
}
VehicleFiles vf=luxWebContext.OrderNumber.Where(x=>x.CommissionNumber==item.Kommissionsnummer)。选择(x=>x.FkVehicleFileNavigation)。SingleOrDefault();
交付=新交付();
customerPayments=新customerPayments();
tblPDI=tblPDIAll.SingleOrDefault(x=>x.Kommissionsnummer==item.Kommissionsnummer);
tblHistory=tblHistoryAll.Where(x=>x.Kommissionsnummer==item.Kommissionsnummer).OrderBy(x=>x.CreationDate.LastOrDefault();
tblDekadenplanung=tblDekadenplanungAll.SingleOrDefault(x=>x.Kommissionsnummer==item.Kommissionsnummer);
tblAdv=tblAdvAll.SingleOrDefault(x=>x.Kommissionsnummer==item.Kommissionsnummer);
//PDI
delivery.Pdichecker=tblPDI.PdiPruefer;
delivery.Pdistatus=tblPDI.PdiOk==“确定”?“1”:“;
如果(!string.IsNullOrEmpty(tblPDI.Pdi)){
log.Info(“Speichere PDI数据:”+DateTime.ParseExact(tblPDI.PDI,“dd/MM/yyyy”,CultureInfo.InvariantCulture));
delivery.Pdidate=DateTime.ParseExact(tblPDI.Pdi,“dd/MM/yyyy”,CultureInfo.InvariantCulture);
}
日期时间日期值;
if(!string.IsNullOrEmpty(tblPDI.zurreiingung)和&DateTime.TryParse(tblPDI.zurreiingung.Replace(“h”,“:”),out dateValue)){
log.Info(“Speichere重新配置数据:”+DateTime.Parse(tblPDI.zurreiingung.Replace(“h”,“:”)));
delivery.ForCleaning=DateTime.Parse(tblPDI.ZurReinigung.Replace(“h”,“:”));
}
//登记册
delivery.PlateMounted=tblPDI.Montiert==“正常”;
delivery.RegistrationStatus=tblPDI.AnmeldungOk==“Ok”;
//奥斯利弗隆
if(tblHistory!=null&!string.IsNullOrEmpty(tblHistory.DeliveryDate)){
log.Info(“Speichere计划交付数据:”+DateTime.Parse(tblHistory.DeliveryDate.Split)(“”[0]);
delivery.PlanDeliveryDate=DateTime.Parse(tblHistory.DeliveryDate.Split(“”[0]);
}
如果(!string.IsNullOrEmpty(item.DatumAuslieferung)){
log.Info(“Speicher交付数据:”+DateTime.Parse(item.datumusaslieferung));
delivery.DeliveryActual=DateTime.Parse(item.datumusaulieferung);
}
delivery.DeliveryPerson=tblDekadenplanung.Auslieferer;
if(tblDekadenplanung.Teamleiter!=null)delivery.TeamLead=DateTime.Parse(tblDekadenplanung.Teamleiter);
delivery.CreationDate=DateTime.Now;
delivery.CreationUser=“MigrationJob”;
//扎伦萨特
十进制值;
customerPayments.Value1=Decimal.TryParse(tbldekadenplanug.Betrag,out value)?Convert.ToDecimal(tbldekadenplanug.Betrag):默认值;
customerPayments.Value2=Decimal.TryParse(tbldekadenplanug.Betrag2,out值)?Convert.ToDecimal(tbldekadenplanug.Betrag2):默认值;
customerPayments.PaymentTyp1=string.IsNullOrEmpty(customerPayments.PaymentTyp1)?PaymentMethodConverter(tblDekadenplanung.Zahlungsart):null;
customerPayments.PaymentTyp2=string.IsNullOrEmpty(customerPayments.PaymentTyp2)?PaymentMethodConverter(tblDekadenplanung.Zahlungsart2):null;
customerPayments.CreationDate=DateTime.Now;
customerPayments.CreationUser=“MigrationJob”;
customerPayments.lastedBy=tbldekadenplanug.LastUser;
如果(!string.IsNullOrEmpty(tblDekadenplanung.UpdateDate))customerPayments.LastEdi
foreach(var item in tblCreated) {
// ..
VehicleFiles vf = luxWebContext.OrderNumbers.Where(x = >x.CommissionNumber == item.Kommissionsnummer).Select(x = >x.FkVehicleFileNavigation).SingleOrDefault();
// Before loop
var orderNumerbsByCommsionNumber = luxWebContext.OrderNumbers.ToLookup(x => x.CommissionNumber) 
// Or ToDictionary(x => x.CommissionNumber) if the CommissionNumber is unique.

foreach(var item in tblCreated) {
// ..
VehicleFiles vf = orderNumerbsByCommsionNumber[item.Kommissionsnummer].Select(x => x.FkVehicleFileNavigation).SingleOrDefault();
tblPDI = tblPDIAll.SingleOrDefault(x = >x.Kommissionsnummer == item.Kommissionsnummer);
tblHistory = tblHistoryAll.Where(x = >x.Kommissionsnummer == item.Kommissionsnummer).OrderBy(x = >x.CreationDate).LastOrDefault();
tblDekadenplanung = tblDekadenplanungAll.SingleOrDefault(x = >x.Kommissionsnummer == item.Kommissionsnummer);
tblAdv = tblAdvAll.SingleOrDefault(x = >x.Kommissionsnummer == item.Kommissionsnummer);
if(counter % 100 = 0)
{
   luxWebContext.SaveChanges(); // Or async version
}
foreach(var item in tblCreated) {
  counter++;
  using(var luxWebContext = new LUX_WEB_SAMContext(optionsBuilder.Options)) {



    if (counter % 100 == 0) {
     Console.WriteLine("\nNächstes Element: " + item.Id + "\nVerarbeitet: " + counter + "\nSekunden seit Beginn: " + (DateTime.Now - begin).TotalSeconds + "\nDauer letzte Zehn: " + (DateTime.Now - lastTime).Milliseconds);
     lastTime = DateTime.Now;


    }