Я только что обновил все приложение WCF с EF4/AutoMapper 1.1 на EF6/AutoMapper 6.0.0.2, и поведение изменилось.
У меня это не работает: Entity Framework - Добавить дочернюю сущность
До :
child.Parent = parentObject
OR
parentObject.Children.Add(child)
был тот же результат в реальном времени (во время отладки == перед SaveChanges), поэтому я решил использовать child.Parent = parentObject
для удобства чтения. child.Parent = parentObject
автоматически добавил дочерний элемент в parentObject. Ребенок также был добавлен в базу данных.
Теперь: child.Parent = parentObject
больше недостаточно (дочерний элемент не добавляется в базу данных), я должен добавить parentObject.Children.Add(child). Иногда мне нужна ссылка child.Parent = parentObject, поэтому приходится писать обе строки. Может кто-нибудь объяснить мне, почему это больше не работает?
Также: я мог бы написать before:
Mapper.CreateMap< Patient, PATIENTENTITY >()
.ForMember(dest => dest.Gender, opt => opt.ResolveUsing< PatientGenderResolver >())
.ForMember(dest => dest.REF_GENDER, opt => opt.Ignore())
где dest.Gender
— это PK (int), а PatientGenderResolver находит идентификатор (int) пола в таблице REF_GENDER. Этого сопоставления было достаточно, чтобы установить PATIENTENTITY.REF_GENDER в реальном времени благодаря преобразователю идентификаторов.
Теперь идентификатор установлен, но PATIENTENTITY.REF_GENDER остается пустым. Также я попытался установить PATIENTENTITY.REF_GENDER напрямую с преобразователем, но он добавил пол в таблицу REF_GENDER...
Итак, еще раз, может кто-нибудь объяснить мне, почему это больше не работает?
ИЗМЕНИТЬ Некоторые уточнения: До:
patientEntity = Mapper.PatientToEntity(patientModel);
//patientEntity.REF_GENDER is null
Context.PATIENTENTITIES.AddObject(patientEntity);
//patientEntity.REF_GENDER is set !
Context.SaveChanges();
Сейчас:
patientEntity = Mapper.PatientToEntity(patientModel);
//patientEntity.REF_GENDER is null
Context.PATIENTS.Add(patientEntity);
//patientEntity.REF_GENDER is still null !
//patientEntity.REF_GENDER = Context.REF_GENDER.Find(patientEntity.Gender);//I am obliged to add this line everywhere for every REF !
Context.SaveChanges();
Я предполагаю, что две проблемы, которые у меня есть, связаны
EDIT Я просто возвращаюсь к своему проекту. Теперь у меня есть EF6 и Automapper 1.1. Проблемы точно такие же, поэтому я думаю, что Automapper не участвует.
ИЗМЕНИТЬ Я могу обойти проблему REF_GENDER с помощью
patientEntity = Mapper.PatientToEntity(patientModel, Context);
public PATIENT PatientToEntity(Patient patient, EntityContainer context)
{
PATIENT entity = AutoMapper.Mapper.Map<Patient, PATIENT>(patient);
if (patient.Id == null || patient.Id == Guid.Empty)
entity.PatientId = Guid.NewGuid();
else
entity.PatientId = patient.Id;
entity.REF_GENDER = context.REF_GENDER.Find(entity.Gender);
return entity;
}
По-видимому, контекст должен быть таким же, иначе в базу данных будет добавлен новый REF_GENDER.