0

编辑:有关工作代码,请参阅此问题的底部。

我有两个表,Patients 和 Drugs,我正在使用数据馈送进行更新。我得到一个当前的患者列表,然后根据需要迭代并更新或插入记录。这没有问题。

当我遍历该患者当前的药物时,麻烦就来了。我最终得到了原始患者的多个副本。药物记录按预期传输(记录本身不会更改,因此插入新记录并忽略现有记录)。我最终得到原始患者记录(从下面的 UpdatePatients() 插入),然后为每个药物记录添加一个额外的患者记录。每个药物记录最终都有一个不同的 PatientId。

类定义:

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

1

为什么每次需要插入新的上下文?这两种方法都是私有的UpdatePatientsUpdateDrugs您可以对所有链接操作使用相同的上下文,我相信您不会得到重复项:

private static void UpdateDrugs(Patient p, VAEContext context) 

...

此外,可能不需要节省每种药物,这样做可能会降低性能并且在数据完整性方面没有太大作用。考虑每次链接更新保存一次上下文更改(比如在 UpdatePatients 中调用 UpdateDrugs 之后)

除此之外,您可以查看 ObjectContext.Attach 和相关方法,了解如何将 Patient 对象链接到新创建的 Drugs 上下文实例

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.attach.aspx

于 2013-07-02T15:01:51.387 回答