0

編集:作業コードについては、この質問の下部を参照してください。

データ フィードで更新する 2 つのテーブル、Patients と Drugs があります。患者の現在のリストを取得し、必要に応じてレコードを反復して更新または挿入します。これは問題なく動作します。

問題は、その患者の現在の投薬を繰り返すときに発生します。元の患者の複数のコピーを取得することになります。薬物レコードは期待どおりに転送されます (レコード自体は変更されないため、新しいレコードが挿入され、既存のレコードは無視されます)。最終的に、元の患者レコード (以下の UpdatePatients() から挿入) と、各投薬レコードに対して 1 つの追加の患者レコードが作成されます。各投薬レコードは、個別の患者 ID で終了します。

クラス定義:

public class Patient
{
    public int PatientId { get; set; }

    [Required]
    public int FacilityNumber { get; set; }

    [Required]
    public int PatNo { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public int Age { get; set; }

    [Required]
    public string Gender { get; set; }

    [Required]
    public DateTime VentStart { get; set; }

    [Required]
    public DateTime VentEnd { get; set; }

    [Required]
    public DateTime AdmitDate { get; set; }

    public DateTime? DischargeDate { get; set; }
}

public class Drug
{
    public int DrugId { get; set; }

    [Required]
    public int DrugDDI { get; set; }

    [Required]
    public int OrderId { get; set; }

    [Required]
    public string DrugName { get; set; }

    [Required]
    public DateTime DispenseDate { get; set; }

    [Required]
    public double UnitsDispensed { get; set; }

    [ForeignKey("Patient")]
    public int PatientId { get; set; }
    public virtual Patient Patient { get; set; }
}

問題のコード:

private static void UpdatePatients()
{
    var Patients = DB2Patient.GetPatients();

    foreach (Patient p in Patients)
    {
        using (var PatientContext = new VAEContext())
        {
            var ExistingPatientRecord = PatientContext.Patients.FirstOrDefault(
                ep => ep.PatNo == p.PatNo
            );
            if (ExistingPatientRecord != null)
            {
                ExistingPatientRecord.VentEnd = p.VentEnd;
                ExistingPatientRecord.DischargeDate = p.DischargeDate;
                PatientContext.SaveChanges();
            }
            else
            {
                PatientContext.Patients.Add(p);
                PatientContext.SaveChanges();
            }
        }
        UpdateDrugs(p);
    }
}

private static void UpdateDrugs(Patient p)
{
    var Drugs = DB2Drug.GetDrugs(p.PatNo);
    foreach (Drug d in Drugs)
    {
        using (var DrugContext = new VAEContext())
        {
            var ExistingDrugRecord = DrugContext.Drugs.FirstOrDefault(
                ed => ed.DrugDDI == d.DrugDDI &&
                      ed.DispenseDate == d.DispenseDate &&
                      ed.OrderId == d.OrderId
            );
            if (ExistingDrugRecord == null)
            {
                d.Patient = p;
                DrugContext.Drugs.Add(d);
                DrugContext.SaveChanges();
            }
        }
    }
}

編集:作業コード:

private static void UpdatePatients()
{
    var Patients = DB2Patient.GetPatients();

    using (var db = new VAEContext())
    {
        foreach (Patient p in Patients)
        {
            var ExistingPatientRecord = db.Patients.FirstOrDefault(
                ep => ep.PatNo == p.PatNo
            );
            if (ExistingPatientRecord != null)
            {
                ExistingPatientRecord.VentEnd = p.VentEnd;
                ExistingPatientRecord.DischargeDate = p.DischargeDate;
            }
            else
            {
                db.Patients.Add(p);
            }
            UpdateDrugs(p, db);
        }
        db.SaveChanges();
    }
}

private static void UpdateDrugs(Patient p, VAEContext ctx)
{
    var Drugs = DB2Drug.GetDrugs(p.PatNo);
    foreach (Drug d in Drugs)
    {
        var ExistingDrugRecord = ctx.Drugs.FirstOrDefault(
            ed => ed.DrugDDI == d.DrugDDI &&
                  ed.DispenseDate == d.DispenseDate &&
                  ed.OrderId == d.OrderId
        );
        if (ExistingDrugRecord == null)
        {
            d.Patient = p;
            ctx.Drugs.Add(d);
        }
    }
}
4

1 に答える 1