2011-09-28 5 views
10

Xin chào Tất cả/rất mới đối với Tự động lập bản đồ. tôi có thể lập bản đồ từ một đến một đối tượng nhưng tự hỏi liệu có thể ánh xạ nhiều đối tượng vào một đối tượng hoặc nhiều đối tượng cho nhiều đối tượng không?cách ánh xạ nhiều đối tượng đến một đối tượng bằng cách sử dụng AutoMapper - asp.net mvc 3

xem xét tôi có một kịch bản sau đây ...

tài khoản Mẫu

public class User 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public Company Company { get; set; } // 1 user work in 1 company 
    } 

Company Model

public class Company 
     { 
      public string CompanyName { get; set; } 
      public string Website { get; set; } 
      public ICollection<User> Users { get; set; } // 1 Company can have many users 
     } 

UserCompanyViewModel

tôi muốn hiển thị Danh sách người dùng với công ty của họ chi tiết trong một chế độ xem ..

public class UserCompanyViewModel 
      { 
       public ICollection<User> Users { get; set; } 
       ppublic ICollection<Company> Companies { get; set; } 
      } 

Bây giờ, có thể ánh xạ trong trường hợp này và nếu có, tôi có thể hiển thị trong một chế độ xem và khi chỉnh sửa chế độ xem đó, tôi muốn ánh xạ lại với các trường được cập nhật về Mô hình tương ứng.

bất kỳ trợ giúp nào sẽ được đánh giá cao ... thx

Trả lời

13

Trong trường hợp này, bạn có thực sự sử dụng nhiều (loại) đối tượng làm nguồn của mình không? Có vẻ như từ vấn đề được xác định của bạn rằng nguồn của bạn là danh sách người dùng - đánh giá bởi "tôi muốn hiển thị Danh sách người dùng với chi tiết công ty của họ".

Nếu đó là trường hợp, trong khi bạn không thể làm điều đó mặc nhiên bạn có thể sử dụng một TypeConverter để thực hiện bản đồ một cách dễ dàng đủ:

Mapper.CreateMap<ICollection<User>, UserCompanyViewModel>() 
     .ConvertUsing<UserCompanyViewModelConverter>(); 

Sau đó, xác định chuyển đổi của bạn như:

public class UserCompanyViewModelConverter : ITypeConverter<ICollection<User>, UserCompanyViewModel> 
{ 
    public UserCompanyViewModel Convert(ResolutionContext context) 
    { 
     UserCompanyViewModel model = new UserCompanyViewModel(); 

     ICollection<User> sourceUsers = (ICollection<User>)context.SourceValue; 

     model.Users  = sourceUsers; 
     model.Companies = sourceUsers.Select(u => u.Company).Distinct().ToList(); 

     return model; 
    } 
} 

Sau đó, khi bạn muốn lập bản đồ, bạn chỉ cần thu thập bộ sưu tập của người dùng someUsers và ánh xạ nó:

UserCompanyViewModel model = Mapper.Map<ICollection<User>, UserCompanyViewModel>(someUsers); 

Nếu bạn thực sự cần ánh xạ nhiều loại nguồn vào một loại đích duy nhất, có vẻ như this blog post bao gồm một lớp Trình trợ giúp ngắn sẽ giúp bạn. Trong ngắn hạn, AutoMapper không hoàn toàn hỗ trợ điều này, do đó bạn sẽ thực hiện một vài yêu cầu Map để điền vào ViewModel của bạn. Bạn sẽ cần phải sử dụng một số TypeConverter khác để đảm bảo rằng cuộc gọi thứ hai không thay thế các Công ty được thêm lần đầu tiên.

+0

như tôi đã nói, trong một chế độ xem, tôi muốn hiển thị một tập hợp người dùng với các chi tiết của công ty. do đó, sẽ có 2 bộ sưu tập người dùng, công ty, vì vậy tôi có UserCompanyViewModel để hiển thị điều đó. –

+0

ViewModel là điểm đến tuy nhiên. Bộ sưu tập nguồn của bạn, dữ liệu mà bạn đang truy xuất từ ​​cửa hàng của mình để đưa vào ViewModel, phải không? – Kasaku

+0

có quyền .. trong trường hợp này, nguồn của tôi là bộ sưu tập Người dùng và Tổng công ty. muốn đặt tất cả cùng nhau trong điểm đến UserCompanyVM và sau đó hiển thị cho người dùng foreach với các chi tiết công ty .. –