У меня есть классы сущностей для хранения объектов в базе данных с использованием классов 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; }
}