Làm thế nào để sử dụng AutoMapper .ForMember?


88

Tôi đang cố gắng thiết lập AutoMapper để chuyển đổi từ Thực thể sang DTO. Tôi biết tôi phải sử dụng .ForMember()after Mapper.CreateMap<Entity, DTO>()để thiết lập ánh xạ tùy chỉnh, nhưng đây dường như không phải là một phương pháp khả dụng.

Chỉnh sửa để làm rõ hơn: Tôi không tìm kiếm liên kết đến tài liệu mà tôi đã đọc hoặc giải thích về cú pháp cơ bản. Tôi đang sử dụng đúng cú pháp như được mô tả trong câu trả lời và tài liệu, ví dụ:

Mapper.CreateMap<EFAddress, Address>()
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name));

Nếu tôi có tên kiểu không hợp lệ trong CreateMap <>, tôi có thể thấy "ForMember" là một phương thức hợp lệ, việc di chuột qua sẽ hiển thị chữ ký phương thức như tôi thường mong đợi. Nhưng ngay sau khi tôi cung cấp cho nó hai loại hợp lệ, ForMember nói rằng nó không thể giải quyết ký hiệu, như thể phương pháp này không khả dụng.

Có một số loại ràng buộc đối với các lớp chung mà tôi không gặp?

Cảm ơn


2
automapper.codeplex.com/… có thể là tài liệu tốt nhất cho những gì bạn đang tìm kiếm. Đừng quên các tham số chung trong lệnh gọi CreateMap.
Travis

2
Cần lưu ý rằng các Mapper.CreateMap<Source, Dest>()phương thức tĩnh được tham chiếu trong tất cả các câu trả lời bên dưới hiện đã lỗi thời (2016) được đánh dấu là lỗi thời .
Ben Ripley

Câu trả lời:


130

Hãy thử cú pháp sau:

Mapper
    .CreateMap<Entity, EntityDto>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );

hoặc nếu thuộc tính nguồn và thuộc tính đích có cùng tên thì chỉ cần:

Mapper.CreateMap<Entity, EntityDto>();

Vui lòng kiểm tra các phần có liên quan của tài liệu để biết thêm chi tiết và các tình huống lập bản đồ khác.


1
Vấn đề của tôi là khi cố gắng sử dụng "ForMember" trong bối cảnh đó tôi chỉ đơn giản nhận được "Không thể quyết tâm biểu tượng 'ForMember'" như nếu phương pháp này không tồn tại
Nellius

@Nellius, bạn chưa hiển thị mã không hoạt động của mình . Tôi đã chỉ ra một ví dụ làm việc. Đảm bảo rằng bạn đã xác định cả lớp chung nguồn và lớp đích, rằng bạn đã tham chiếu AutoMapper bên trong dự án của mình và cú pháp được hiển thị trong tài liệu (và trong câu trả lời của tôi) sẽ hoạt động.
Darin Dimitrov

4
Câu hỏi ngớ ngẩn, opt nghĩa là gì?
riadh gomri

@riadhgomri tùy chọn / tùy chọn cho thành viên
andrewb

17

Cuối cùng, tôi tin rằng điều này hóa ra là một loại không tương thích với ReSharper.

ReSharper dường như đã khiến mã Automapper hiển thị không chính xác, nhưng hoạt động tốt (mặc dù nó hiển thị màu đỏ kèm theo thông báo lỗi). Gỡ cài đặt ReSharper đã khắc phục hoàn toàn sự cố này.


2
Phiên bản nào của ReSharper? Phiên bản nào của AutoMapper?
Colin Pear

1
Tôi nghĩ vấn đề này ảnh hưởng đến AutoMapper và ReSharper 8.x trong VisualStudio 2010. Xem github.com/AutoMapper/AutoMapper/issues/381
dthrasher

tương tự với tôi với re # 8.2 nhưng với 2012, với 7.0 hoạt động tốt.
Carlos Guillermo Bolaños Lopez

tại sao câu trả lời với 51 phiếu bầu không phải là câu trả lời được chọn? nực cười.
Chris Hawkes

4
Vì nó không trả lời câu hỏi mà tôi đã hỏi. Câu hỏi của tôi là về các phương pháp dường như không được nhận dạng trong studio trực quan, khi sử dụng đúng cú pháp và tham chiếu mọi thứ một cách chính xác. Đây hóa ra là một lỗi liên quan đến trình sạc lại. Câu trả lời còn lại trả lời một câu hỏi rất giống với câu tôi đã hỏi, nhưng đó là một câu trả lời hoàn toàn không chính xác với câu tôi thực sự đã hỏi.
Nellius

9

một triển khai mẫu sẽ như sau:

Mapper.CreateMap<Game, GameViewModel>()
  .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type))

Chúng tôi cần ánh xạ thuộc tính này vì tên của các thuộc tính của Game và GameViewModel là khác nhau - nếu chúng giống nhau và cùng loại thì nó sẽ không cần ForMember

một công dụng khác của ForMember là bỏ qua ánh xạ

Mapper.CreateMap<Game, GameViewModel>()
    .ForMember(dest => dest.Prize, opt => opt.Ignore());

1

Việc sử dụng này cũng như:

  CreateMap<Azmoon, AzmoonViewModel>()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();

-8

Bạn có đang làm như thế này không

Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here)

Trang này có một số ví dụ điển hình

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.