2013-07-02 4 views
0

EDIT: см. Нижнюю часть этого вопроса для рабочего кода.Entity Framework добавляет слишком много записей

У меня есть две таблицы, пациенты и наркотики, которые я обновляю с помощью фида данных. Я получаю текущий список пациентов, затем перебираю и обновляю или вставляю записи по мере необходимости. Это работает без проблем.

Проблема возникает, когда я повторяю текущие лекарства этого пациента. Я получаю несколько копий оригинального пациента. Записи медикаментов переносятся как ожидалось (сами записи не меняются, поэтому новые записи вставлены и существующие записи игнорируются). Я заканчиваю оригинальную запись пациента (вставленную из 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(); 
      } 
     } 
    } 
} 

EDIT: Рабочий код:

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); 
     } 
    } 
} 

ответ

1

Почему новый контекст каждый раз, когда что-то нужно вставить? Оба метода UpdatePatients и UpdateDrugs являются частными, вы можете использовать один и тот же контекст для всех связанных операций, и я уверен, что вы не будете получать дубликаты:

private static void UpdateDrugs(Patient p, VAEContext context) 

...

И нет, наверное, нет необходимости чтобы сэкономить на каждом препарате, делая это, вероятно, снижает производительность и не делает многого с точки зрения целостности данных. Рассмотрите возможность сохранения изменений контекста один раз для каждого связанного обновления (например, после того, как UpdateDrugs вызывается в UpdatePatients)

Кроме этого вы можете проверить ObjectContext.Attach и связанные с ним методы связывания объекта Patient с вновь созданным экземпляром контекста наркотиков

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

+0

Я все еще учусь EF и лучшие практики, связанных с ним. Это делает именно то, что мне нужно, но я не хотел этого делать. Я обновлю свой вопрос, чтобы содержать рабочий код для справок в будущем. Благодаря! –