2012-11-04 47 views
5

Tôi đã đọc this example on AutoMapper's GirHub, nhưng ví dụ giả định có sẽ chỉ là một cách để lập bản đồ InnerSource, bao giờ hết:AutoMapper ánh xạ lồng nhau phức tạp

Mapper.CreateMap<OuterSource, OuterDest>(); 
Mapper.CreateMap<InnerSource, InnerDest>(); 
Mapper.AssertConfigurationIsValid(); 

var source = new OuterSource 
    { 
     Value = 5, 
     Inner = new InnerSource {OtherValue = 15} 
    }; 

var dest = Mapper.Map<OuterSource, OuterDest>(source); 

Với dự án của tôi, tôi serializing đối tượng được tạo với EF rằng có tham chiếu vòng tròn. Lý do cho điều này là tôi sẽ cần phải đến các đối tượng từ các hướng khác nhau. Ví dụ: nếu tôi yêu cầu danh sách người dùng, tôi muốn xem các dự án mà họ được liên kết. Nếu tôi yêu cầu một dự án, tôi muốn thấy những người dùng được liên kết với dự án đó.

Những tham chiếu vòng tròn có thể nhận được khá sâu, như User.Role.Project.TaskTime.User, User.TaskTime.Project.Task.TaskType.VisibleToRole.Role.User vv

Vì vậy, tôi cần các bản đồ lồng nhau để được khá sâu, và cách nó được thực hiện phụ thuộc vào những gì các bản đồ đầu tiên là.

Hiện nay tôi đang làm:

Mapper.CreateMap<User, UserFull>() 
    .ForMember("TaskTimes", opt => opt.MapFrom(src => Mapper.Map<ICollection<TaskTime>, UserTaskTime>(src.TaskTimes))); 
Mapper.CreateMap<TaskTime, UserTaskTime>() 
    .ForMember("Task", opt => opt.MapFrom(src => Mapper.Map<Task, UserTaskTimeTask>(src.Task))); 
//... 

Các viewmodels cho đoạn mà trông như thế này:

public class UserFull 
{ 
    public string Email { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<TaskTime> TaskTimes { get; set; } 
    //... 
} 

public class UserTaskTime 
{ 
    public int Id { get; set; } 
    public Task Task { get; set; } 
    //... 
} 

public class UserTaskTimeTask 
{ 
    //... 
} 

là quyền này? Tôi có nên chiếu từng thành viên từ viewmodel và ánh xạ nó bằng tay bằng cách sử dụng phép chiếu không? Hoặc là có một cách sạch hơn để làm điều này?

+0

Bạn đang sử dụng automapper để ánh xạ các giá trị từ ViewModel đến các thực thể DB của bạn? Tôi khuyên bạn không nên sử dụng AutoMapper cho các mục đích này và thực hiện theo cách thủ công, nếu không bạn sẽ kết thúc với các cấu hình bản đồ phức tạp sẽ không thành công nếu bạn thêm các thực thể mới sử dụng các đối tượng cũ để lập bản đồ. –

Trả lời

0

Bạn có thể thực hiện ánh xạ lồng nhau cho từng thành viên. Câu trả lời tương tự tôi đã đăng here. Hy vọng nó giúp.

+0

Câu trả lời đó là về làm phẳng mảng lồng nhau - Tôi nghĩ rằng anh ta sau một cái gì đó giống như http://stackoverflow.com/questions/13337063/nested-mappings-with-instance-version-of-automapper nơi các thực thể tham chiếu lẫn nhau. – Mightymuke

+0

Ồ - Tôi vừa nhận thấy rằng cùng một áp phích của nó :) – Mightymuke

+0

Có, vào thời điểm tôi hỏi câu hỏi khác tôi đã tìm ra bằng cách sử dụng phiên bản của AutoMapper, mà khá nhiều giải quyết vấn đề tôi đã có ở đây –

Các vấn đề liên quan