AutoMapper werfen StackOverflowException beim Aufruf ProjectTo<T>() auf IQueryable
Ich habe Klassen erstellt mit EF Code First, die Sammlungen des jeweils anderen.
Personen:
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>();
}
}
Zuordnungen:
Mapper.CreateMap<Field, FieldDTO>();
Mapper.CreateMap<FieldDTO, Field>();
Mapper.CreateMap<AppUserDTO, AppUser>();
Mapper.CreateMap<AppUser, AppUserDTO>();
Und ich bin immer StackOverflowException beim aufrufen dieser code (Kontext-ist mein dbContext):
protected override IQueryable<FieldDTO> GetQueryable()
{
IQueryable<Field> query = Context.Fields;
return query.ProjectTo<FieldDTO>();//exception thrown here
}
Ich denke, dies geschieht, weil es eine Schleife in den Listen, indem Sie jedes andere endlos. Aber ich verstehe nicht, warum dies geschieht. Sind meine Zuordnungen falsch?
- Du hast Recht. Das problem ist eine Endlosschleife beim Aufruf mapper auf den Listen. Deine Zuordnungen richtig sind. Sie können versuchen, die leere Listen vor der Konvertierung von Entitäten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie selbst referenzierende entities UND self-referencing DTOs. Im Allgemeinen self-referencing DTOs sind eine schlechte Idee. Vor allem, wenn dabei eine Projektion - EF nicht weiß, wie die zusammenkommen und sich zusammen schließen und gemeinsam eine Hierarchie von Elementen.
Haben Sie zwei Möglichkeiten.
Ersten, können Sie nicht zwingen, eine bestimmte Tiefe der Hierarchie, indem Sie explizit die Modellierung Ihrer DTOs mit einer Hierarchie in den Sinn:
Dies ist die bevorzugte Art und Weise, wie es die meisten offensichtlich und explizit.
Die weniger offensichtlichen, weniger explizite Weise zu konfigurieren, AutoMapper, um eine maximale Tiefe wird es gehen, um die traverse hierarchische Beziehungen:
Ich gehe lieber #1, weil es die am leichtesten zu verstehen, aber #2 so gut funktioniert.
Andere option ist die Verwendung PreserveReferences () - Methode.
Ich diese generische Methode: