2017-02-19 6 views
0

У меня есть код первое, что использование ребенком родителя с таким же типомAutomapper карта ребенка одного типа

public class Comment 
{ 
    public int Id { get; set; } 

    public string Text { get; set; } 

    public int? ParentId { get; set; } 

    public virtual Comment Parent { get; set; } 
    public virtual IList<Comment> Child { get; set; } 
} 

Fluent API:

modelBuilder.Entity<Comment>().Property(c => c.ParentId).IsOptional(); 
modelBuilder.Entity<Comment>().HasMany(c => c.Child).WithOptional(c => c.Parent).HasForeignKey(c => c.ParentId); 

Это нормально в рамках сущности. Но когда я пытаюсь использовать его на Automapper, я бросаю исключение StackOverflowException.

AutoMapperConfig:

cfg.CreateMap<Comment, CommentDTO>().ForMember(d => d.Child, opt => opt.UseDestinationValue()); 

CommentDTO:

public class CommentDTO 
{ 
    public int Id { get; set; } 

    public string Text { get; set; } 

    public int? ParentId { get; set; } 

    public virtual CommentDTO Parent { get; set; } 
    public virtual IList<CommentDTO> Child { get; set; } 
} 

Контроллер:

Context.Comments.GetAll().AsNoTracking().ProjectTo<CommentDTO>().AsQueryable(); 

ответ

0

Поскольку ваши имена свойств в обоих Comment и CommentDTO одинаковы, вам просто нужно проинструктировать AutoMapper отобразить их, и это wi сделаю это для вас:

Mapper.Initialize(x => 
     x.CreateMap<Comment, CommentDTO>().ReverseMap() 
      .PreserveReferences()); 

Я использовал ReverseMap, чтобы отображение в обоих направлениях. Тогда вы можете использовать его, когда захотите;

var commentDto = new CommentDTO { Child = new List<CommentDTO>(), Id = 1 }; 
var mapped = Mapper.Map<Comment>(commentDto); 
var reverse = Mapper.Map<CommentDTO>(mapped); 

И одна последняя нота, в именовании .NET, если аббревиатура содержит 2 символов, таких как Input Output > IO то рекомендуется использовать верхние случаи как для таких, как System.IO. Но если это больше, чем 2, например, Data Transfer Object > DTO, то рекомендуется использовать нотацию Pascal. Таким образом, ваше имя класса должно быть CommentDto не CommentDTO.

+0

Благодарим за помощь и за советы относительно соглашения об именах. К сожалению, также используя ReverseMap, я получаю ошибку StackOverflowException, когда я вызываю свою функцию Context.Comments.ProjectTo (); – Sauron

+0

Попробуйте использовать '.PreserveReferences()', как я отредактировал в своем ответе, пожалуйста. – CodingYoshi

+0

Жаль, нечего делать. Я думаю, что StackOverflowException вызван списком дочернего типа того же типа. Аналогичный вопрос здесь http://stackoverflow.com/questions/37785124/automapper-map-child-list-with-from-same-type – Sauron

Смежные вопросы