Ho creato classi utilizzando prima il codice EF che dispone di raccolte l'una dell'altra. Entità:AutoMapper che lancia StackOverflowException quando si chiama ProjectTo <T>() su IQueryable
public class Field
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<AppUser> Teachers { get; set; }
public Field()
{
Teachers = new List<AppUser>();
}
}
public class AppUser
{
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string UserName => Email;
public virtual List<Field> Fields { get; set; }
public AppUser()
{
Fields = new List<FieldDTO>();
}
}
DTOs:
public class FieldDTO
{
public int Id { get; set; }
public string Name { get; set; }
public List<AppUserDTO> Teachers { get; set; }
public FieldDTO()
{
Teachers = new List<AppUserDTO>();
}
}
public class AppUserDTO
{
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string UserName => Email;
public List<FieldDTO> Fields { get; set; }
public AppUserDTO()
{
Fields = new List<FieldDTO>();
}
}
Mapping:
Mapper.CreateMap<Field, FieldDTO>();
Mapper.CreateMap<FieldDTO, Field>();
Mapper.CreateMap<AppUserDTO, AppUser>();
Mapper.CreateMap<AppUser, AppUserDTO>();
E io sono sempre StackOverflowException quando si chiama questo codice (Context è il mio DbContext):
protected override IQueryable<FieldDTO> GetQueryable()
{
IQueryable<Field> query = Context.Fields;
return query.ProjectTo<FieldDTO>();//exception thrown here
}
Suppongo che ciò accada perché scorre in elenchi che si chiamano all'infinito. Ma non capisco perché questo accada. Le mie mappature sono sbagliate?
Hai ragione. Il problema è un ciclo infinito quando si chiama il mapper sugli elenchi. I tuoi mapping sono corretti. Puoi provare a svuotare le liste prima di convertire le entità. – erikscandola