Кэширование вложенного свойства при отображении - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь отобразить 2 объекта, где исходный объект имеет пару загруженных Lazy свойств, которые go в БД при каждом их использовании. Я не могу изменить эти объекты. Я могу только изменить отображение. Вот что у меня есть.

        CreateMap<CasePlan, CasePlanView>()
            .ForMember(d => d.ProgramId, o => o.MapFrom(s => s.PrimaryReferral.ProgramRevisionId))
            .ForMember(d => d.ClientName, o => o.MapFrom(s => s.PrimaryReferral.Client.FullName))
            .ForMember(d => d.ClientId, o => o.MapFrom(s => s.PrimaryReferral.ClientId))
            .ForMember(v => v.ClientBirthDate, o => o.MapFrom(s => s.PrimaryReferral.Client.BirthDate))
            .ForMember(d => d.EnrollmentStartDate, o => o.MapFrom(s => s.PrimaryReferral.Enrollment.StartDate))
            .ForMember(d => d.Age, o => o.MapFrom(s => s.PrimaryReferral.Client.BirthDate.ToAgeStringAtDate(s.Date).Replace("old", "")))
            .ForMember(d => d.Program, o => o.MapFrom(s => s.PrimaryReferral.ProgramRevision.Program.Abbreviation))
            .ForMember(d => d.PlacementWorker, o => o.MapFrom(s => s.PrimaryReferral.PlacementWorker.Name))
            .ForMember(d => d.ReferralAgencyName, o => o.MapFrom(s => s.PrimaryReferral.ReferralSource.Name))
            .ForMember(d => d.CourtStatus, o => o.MapFrom(s => s.PrimaryReferral.Client.LegalStatuses.FirstOrDefault() != null ? s.PrimaryReferral.Client.LegalStatuses.First().Status : null))
            .ForMember(d => d.Approver, o => o.MapFrom(r => r.Approver.DisplayName))
            .ForMember(d => d.ApproverId, o => o.MapFrom(s => s.ApproverId));

Все отображается правильно, но очень медленно! Каждый раз, когда я использую свойство PrimarryReferral, выполняется вызов БД. Есть ли способ указать AutoMapper кешировать значение и использовать его для всех последующих использований?

1 Ответ

1 голос
/ 30 января 2020

Будет ли это работать для вас?

CreateMap<CasePlan, CasePlanView>()
     .ConstructUsing((caseplan, b) => { 
          var client= a.PrimaryReferral.Client; 
          return new CasePlanView(){ 
              ClientName= client.FullName,
              ClientBirthDate= client.BirthDate //and so on
    }
    });

Таким образом, по крайней мере, вы не получите доступ к базе данных более одного раза для свойств a.PrimaryReferral.Client. Однако вам потребуется доступ к базе данных для каждого объекта, который имеет свойства.

Один из способов исправить это - устранить необходимость в отложенной загрузке с использованием include в источнике CasePlan. Я не знаю, сможете ли вы это сделать, но это был бы мой совет.

Другой способ, который я бы не рекомендовал, - это ввести DatabaseContext (или хранилище) в маппер. и используя PK CasePlan, вы снова получаете CasePlan из базы данных. (По сути, это не будет отображаться из объекта CasePlan, но приведет к повторному получению объекта из БД. Поэтому это вызовет дополнительные проблемы, если данные из объекта CasePlan не совпадают с данными в БД).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...