2 - Я расследую, чтобы улучшить производительность загрузки. Я только что заметил с SQL Profiler, что «запрос где» использует отложенную загрузку: только один выбор / где для «самого высокого» объекта. Затем я заметил, что AutoMapper делает много выбор / где во время отображения из-за отложенной загрузки. Это не кажется очень эффективным! Поэтому я попробовал методы .Include (many) в основном запросе: это многопользовательский запрос, который мне кажется более эффективным. Но тогда сопоставление все еще делает то же самое количество выбора / где, так что мне интересно, если AutoMapper все еще оправдано?
ько что обновил все приложение WCF изEF4 / AutoMapper 1.1 вEF6 / AutoMapper 6.0.0.2 и поведение не совсем то же самое.
Это не работает для меня:Entity Framework - Добавить дочернюю сущность
До :
child.Parent = parentObject
ИЛИ ЖЕ
parentObject.Children.Add(child)
результат был в реальном времени (при отладке == до SaveChanges), поэтому я решил использоватьchild.Parent = parentObject
для читабельности.child.Parent = parentObject
добавил потомка в parentObject автоматически. Ребенок также был добавлен в БД.
В настоящее время : child.Parent = parentObject
больше не достаточно (дочерний элемент не добавлен в БД), я должен добавить parentObject.Children.Add (child). Иногда мне нужна ссылка child.Parent = parentObject, поэтому я должен написать обе строки. Может кто-нибудь объяснить мне, почему это больше не работает?
Также: я мог бы написатьдо :
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 в реальном времени благодаря распознавателю Id.
В настоящее время Идентификатор установлен, но 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();
Я думаю, что две проблемы, которые у меня есть, связаны
РЕДАКТИРОВАТЬ Я просто возвращаюсь в свой проект. Теперь у меня есть 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 добавляется в БД