2016-12-09 9 views
1

Мне кажется, что использование AutoMapper ProjectTo<> добавляет нежелательный (рассчитанный) столбец к моему запросу. Вот запрос:Предотвращение AutoMapper ProjectTo от добавления нежелательного столбца

SELECT TOP(1) CASE 
    WHEN [dto].[Id] IS NULL 
    THEN CAST(0 AS BIT) ELSE CAST(1 AS BIT) 
END, [dto].[Enabled], [dto].[DurationWarningThresholdSec], [dto].[AverageDurationLabel] 

где что первый СЛУЧАЙ & CAST неназванный столбец на самом деле не нужно, я думаю. Это суть моей проблемы.

Это EF Ядро (возможно, что вопросы) ПОКО объект выполняется запрос:

public class CountersConfigData 
{ 
    public Guid Id { get; set; } 

    public bool Enabled { get; set; } 
    public int DurationWarningThresholdSec { get; set; } 
    public string AverageDurationLabel { get; set; } 

    public DateTime CreatedAt { get; set; } 
    public DateTime? ModifiedAt { get; set; } 
    public DateTime? DeletedAt { get; set; } 
    public Guid CompanyId { get; set; } 
} 

// within DbContext.OnModelCreating() 
entityTypeBuilder.HasKey(cfg => cfg.Id); 
entityTypeBuilder.HasIndex(cfg => cfg.DeletedAt); 

Вот форма назначения отображения:

public class Result 
{ 
    public bool Existing { get; set; } 
    public CountersMainConfig Main { get; set; } 
} 

public class CountersMainConfig 
{ 
    public bool Enabled { get; set; } 
    public int DurationWarningThresholdSec { get; set; } 
    public string AverageDurationLabel { get; set; } 
} 

Это отображение начальной настройки:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<CountersConfigData, Result>() 
     .ForMember(dest => dest.Main, opt => opt.MapFrom(src => src)) 
     .ForMember(dest => dest.Existing, opt => opt.Ignore()); 

    cfg.CreateMap<CountersConfigData, CountersMainConfig>(); 
}); 

Я понимаю, что могу проектировать внутренний тип, CountersMainConfig, а затем вручную создать экземпляр внешнего типа. Но у меня есть другие случаи, похожие на этот, с более сложными внешними типами, поэтому я бы хотел разобраться в них для всех.

Если я на самом деле проектирую внутренний тип, этот первый столбец уходит от сгенерированного запроса. Что мне не хватает? TA

EDIT Я создал упрощенное решение, чтобы подтвердить этот вопрос, прежде чем спрашивать здесь. Впоследствии я также попытался изменить внешний класс назначения, сделав Existing поплавком или удалив его, не повезло.

+0

Попробуйте установить постоянное значение вместо 'Ignore':' .ForMember (dest => dest.Existing, opt => opt.UseValue (false)); '. Не очень чистый. «Игнорировать» должен работать. Возможно, если вы установите значение boolean как nullable, будет применено 'Ignore'? Возможно, ваше сопоставление переопределяется после первоначального определения и потеряет «Ignore»? – Diana

+1

Спасибо, что ответили. Но тот же SQL генерируется даже после полного удаления свойства «Существующий», поэтому почему-то это приводит меня к тому, что такое свойство не имеет большого значения. Кажется, что это связано с вложенной структурой адресата. Я попробую. – superjos

+1

Просто чтобы подтвердить, что логическое свойство не было проблемой. @ Иван Стоев ответил трюк – superjos

ответ

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

  • Нет связанных вопросов^_^