Как я могу связать новую сущность с существующей сущностью в EF4? - PullRequest
0 голосов
/ 20 марта 2011

У меня есть объект Patient (хранящий актуальную информацию о пациенте) и объект TreatmentPlanPatient (копия даты пациента, как это было, когда в «плане лечения» другой объект неотносящиеся к этому вопросу, были созданы):

EF4 ORM model for my Patient entities

Я использую Table-per-Type в этом случае.Теперь, когда я пытаюсь добавить новый TreatmentPlanPatient, который указывает на Patient, из которого он был создан, EF4 фактически делает это:

  1. Он извлекает существующего пациента из базы данных
  2. Создает копию этого пациента
  3. Назначает ему новый идентификатор GUID (несмотря на StoreGeneratedPattern = нет!)
  4. Вставляет нового пациента в Patients таблицу
  5. ПереписываетИдентификатор в моем TreatmentPlanPatient экземпляре, указывающий на этого нового пациента
  6. Вставляет нового пациента плана лечения в таблицу TreatmentPlanPatients.

Это мой код, вызывающий вышеуказанное поведение:

using(var container = new SmartTherapyContainer()) {

  // Look up the patient in the current container to make sure EF4 recognizes it
  var patient = container.Patients.First(r => r.Id == selectedPatient.Id);

  var treatmentPlanPatient = new TreatmentPlanPatient() {
    Id = Guid.NewGuid(),
    FirstName = patient.FirstName,
    LastName = patient.LastName,
    Street = patient.Street,
    ZipCode = patient.ZipCode,
    City = patient.City,
    BirthDate = patient.BirthDate,
    Telephone = patient.Telephone,
    Email = patient.Email,
    ClonedPatient = patient
  };

  // EF4 doesn't generate a separate .TreatmentPlanPatients collection :-/
  container.Patients.AddObject(treatmentPlanPatient);
  container.SaveChanges();

}

Что происходит?Как заставить EF4 просто вставить пациента плана лечения в таблицу TreatmentPlanPatients и связать его с существующим пациентом в таблице Patients?

1 Ответ

1 голос
/ 21 марта 2011

Я не уверен, что полностью понимаю, что вы пытаетесь сделать, но в соответствии с вашей схемой таблица Patient является родительской для таблицы TreatmentPlanPatients (отношение один ко многим).Следовательно, вам следует добавить План обработки в самого пациента, а не в таблицу пациентов.Таким образом, вместо того, чтобы делать container.Patients.AddObject (treatmentPlanPatient), вы должны выполнять в файле Patient.TreatmentPlanPatients.Add (treatmentPlanPatient).В этом случае TreatmentPlanPatients должен быть навигационным свойством таблицы / объекта Patient.

ИЛИ, если вы действительно хотите использовать наследование, то вы должны использовать один и тот же первичный ключ (в данном случае Id) в обоихтаблицы и имеют отношение один к одному.

...