2015-07-31 3 views
2

Я использую Entity Framework 6 и Automapper для привязки объектов к dtos.Можно ли сказать automapper игнорировать отображение во время выполнения?

У меня есть эта модель

public class PersonDto 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public AddressDto Address { get; set; } 
} 

public class AddressDto 
{ 
    public int Id { get; set; } 
    public string Street { get; set; } 
    public string City { get; set; } 
} 

Я использую automapper Queryable Extension для отображения DTO от объекта.

var personDto = dbContext.People.Project().To<PersonDto>(); 

Проблема с вышеуказанным методом заключается в том, что он заставит EF всегда загружать объект адреса. Я хочу, чтобы адрес загружался только в том случае, если я им явно указываю include (x => x.Address). Если я укажу ignore() в карте automapper, адрес не будет загружен. Можно ли сказать automapper игнорировать свойство адреса во время выполнения? Automapper запрашиваемые расширения, которые я использую, не поддерживает все функции, такие как «Условие или после карты». Есть ли обходной путь для этого?

+1

Почему бы не создать другой PersonDto без адреса. – scottheckel

+0

Это упрощенные модели. Мои реальные модели могут иметь более 3 таких свойств. Мне было бы больно создавать отдельную модель для каждого сценария. – Reynaldi

+0

@Reynaldi, похоже, Queryable Extension стремится загружать объекты для вас. Я не уверен, как это будет работать, но вы можете попытаться отключить ленивую загрузку, установить свои включенные функции, а затем вызвать метод Project(). – DDiVita

ответ

3

Необходимо включить явное расширение для ваших DTO. Во-первых, в конфигурации:

Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(d => d.Address, opt => opt.ExplicitExpansion()); 

Тогда во время выполнения:

dbContext.People.Project.To<PersonDto>(membersToExpand: d => d.Address); 

«membersToExpand» может быть список выражений для членов назначения, или словарь значений строк, представляющих имена свойств для расширения.

+0

Ничего себе это круто. Я попробую. Спасибо – Reynaldi

+0

Но могу ли я использовать обычное отображение с mapper.map? – Reynaldi

+0

В вашем вопросе говорится, что проекции - эти две функции не являются взаимозаменяемыми в AutoMapper. –

Смежные вопросы