Задать вопрос
supra7sky
@supra7sky

Automapper. Как заставить его игнорировать свойства в Destination для которых нету соответствия в Source?

Есть классы BLL.Story (меньше свойств) и DAL.Story (больше свойств).
При конвертации из DAL.Story в BLL.Story все работает. Если выполнять обратную операцию, то бросается эксепшн:
{"Missing type map configuration or unsupported mapping.
Mapping types: RuntimeType -> Type System.RuntimeType -> AgilityTracker.DAL.Type
Destination path: Story.Type.Type
Source value: AgilityTracker.BLL.DataModel.Story"}

Я предполагаю, что маппер не знает, чем заполнить поля в Destination, которых нету в Source.
Как настроить маппер, что бы в таких случаях эти поля заполнялись значениями по умолчанию, которые определены для их типов соответственно?
  • Вопрос задан
  • 3259 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
supra7sky
@supra7sky Автор вопроса
Решение:
using System.Linq;
using System.Reflection;
using AutoMapper;

namespace AgilityTracker.BLL.Extension
{
    public static class MappingExpressionExtension
    {
        /// <summary>
        /// Игнорирует свойства в Destination для которых нет соотвествия в Source
        /// </summary>
        public static IMappingExpression<TSource, TDest> IgnoreAllUnmapped<TSource, TDest>(this IMappingExpression<TSource, TDest> expression)
        {
            var destinationProperties = typeof(TDest).GetProperties().Select<PropertyInfo, string>(s => s.Name);
            var sourceProperties = typeof(TSource).GetProperties().Select<PropertyInfo, string>(s => s.Name);
            var difference = destinationProperties.Except(sourceProperties);
            difference.Each(item => expression.ForMember(item, o => o.Ignore()));
            return expression;
        }
    }
}

Использование:
using AgilityTracker.BLL.Extension;
...
Mapper.CreateMap<Story, DAL.Story>()
                .IgnoreAllUnmapped();

Стандартного метода, как я понял, в AutoMapper нету?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы