Почему .ForPath () вызывает исключение StackOverflowException, а .ForMember () - нет? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть классы сущностей для хранения объектов в базе данных с использованием классов EF и домена.И EF-классы, и доменные классы являются самореферентными.Я вижу здесь: AutoMapper создает исключение StackOverflowException при вызове ProjectTo () для IQueryable , что не рекомендуется [иметь собственные ссылки на EF и доменные классы], но я не вижу другого способа модделингамои объекты.

Когда я настраиваю AutoMapper, используя .ForPath(), это вызывает StackOverflowException.Использование .ForMember() работает.

Я прочитал AutoMapper: В чем разница между ForMember () и ForPath ()? , но в основном ответ говорит: «они одинаковы» (не слишком полезно)

Минимальная демонстрация:

using System;
using System.Collections.Generic;
using System.Linq;
using AutoMapper;

class Program
{
    static void Main(string[] args)
    {
        var mapperConfig = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Processor, ProcessorEntity>().ReverseMap();
            cfg.CreateMap<ScheduleEntity, Schedule>()
                .ForMember(dest => dest.Processor, opt => opt.MapFrom(src => src.Processor));
        });
        var mapperConfigStackOverflow = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Processor, ProcessorEntity>().ReverseMap();
            cfg.CreateMap<ScheduleEntity, Schedule>()
                .ForPath(dest => dest.Processor, opt => opt.MapFrom(src => src.Processor));
        });

        var mapper = mapperConfig.CreateMapper();
        var stackOverflowMapper = mapperConfigStackOverflow.CreateMapper();

        var pe = new ProcessorEntity
        {
            Schedules = new List<ScheduleEntity>
            {
                new ScheduleEntity()
            }
        };
        pe.Schedules.First().Processor = pe;

        var processor = mapper.Map<Processor>(pe);
        Console.WriteLine("the processor:" + processor);

        Console.WriteLine("expect a stackoverflow in 3, 2, 1...");
        var neverSatisfied = stackOverflowMapper.Map<Processor>(pe);

    }
}

public class ProcessorEntity
{
    public ICollection<ScheduleEntity> Schedules { get; set; }
}

public class ScheduleEntity
{
    public ProcessorEntity Processor { get; set; }
}

public class Processor
{
    public ICollection<Schedule> Schedules { get; set; }
}

public class Schedule
{
    public Processor Processor { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...