Automapper: Cập nhật giá trị thuộc tính mà không tạo đối tượng mới


260

Làm cách nào tôi có thể sử dụng automapper để cập nhật các giá trị thuộc tính của đối tượng khác mà không cần tạo đối tượng mới?

Câu trả lời:


456

Sử dụng quá tải mất điểm đến hiện tại:

Mapper.Map<Source, Destination>(source, destination);

Vâng, nó trả về đối tượng đích, nhưng đó chỉ là cho một số tình huống tối nghĩa khác. Đó là cùng một đối tượng.


28
Cảm ơn, Jimmy ... Tôi cố tình tránh xa AutoMapper vì tôi sợ đường cong học tập ảnh hưởng đến lịch trình của mình. Tôi chính thức xin lỗi tôi đã ở xa quá lâu ... nó dễ dàng hơn nhiều so với tôi nghĩ ban đầu.
Neil T.

13
Automapper phải là một trong những thư viện hữu ích nhất hiện có. Tôi cũng tránh nó trong một thời gian dài, quá lâu. Tôi bắt đầu sử dụng nó ngày hôm nay và rất ngạc nhiên về việc sử dụng nó dễ dàng như thế nào.
mcottingham

4
Không làm việc cho tôi. Tôi cố gắng ánh xạ tới cùng loại, nhưng nó trả về đối tượng mới. Người dùng u1, u3 = Người dùng mới (); u1 = Người dùng mới {Id = 1, NickName = "vami"}; Người dùng u4 = Mapper.Map (u1, u3); Khẳng định.AreEqual (u1.Id, u3.Id); Khẳng định.AreEqual (u1.NickName, u3.NickName);
Péter

7
FYI, tôi phát hiện ra bạn không cần chỉ định tham số loại. Đơn giản, Mapper.Map (nguồn, đích) sẽ hoạt động. Đẹp và đơn giản!
Judah Gabriel Himango

2
Hành vi NULL có thay đổi trong phiên bản 4.2.1 không? Tôi thấy rằng ánh xạ null vào một đối tượng trả về null; trong khi đó trong 2.2.1, ánh xạ null vào một đối tượng hiện có trả về đối tượng hiện có.
Peter McEvoy

18

Để thực hiện công việc này, bạn phải tạo Bản đồ cho các loại nguồn và đích ngay cả khi chúng cùng loại. Điều đó có nghĩa là nếu bạn muốn Mapper.Map<User, User>(user1, user2); Bạn cần tạo bản đồ như thế này Mapper.Create<User, User>()


1
Hà! Tôi vừa tìm thấy tương tự và thêm một nhận xét cho câu trả lời được chấp nhận. IMHO câu trả lời được chấp nhận mà không có lời giải thích của bạn chưa đầy đủ nhưng cuối cùng sau nhận xét của tôi thì có thể là :)
Andrzej Martyna

Đây là một bổ sung tuyệt vời. Tuy nhiên, câu hỏi ban đầu không đề cập đến các loại nguồn và đích và không yêu cầu chúng phải cùng loại.
jpaugh

4

Nếu bạn muốn sử dụng một phương thức IMapper, thay vì phương thức tĩnh được sử dụng trong câu trả lời được chấp nhận, bạn có thể thực hiện như sau (đã thử nghiệm AutoMapper 6.2.2)

IMapper _mapper;
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Source, Destination>();
});
_mapper = config.CreateMapper();

Source src = new Source
{
//initialize properties
}

Destination dest = new dest
{
//initialize properties
}
_mapper.Map(src, dest);

destbây giờ sẽ được cập nhật với tất cả các giá trị thuộc tính srcmà nó chia sẻ. Các giá trị thuộc tính độc đáo của nó sẽ giữ nguyên.

Đây là mã nguồn có liên quan

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.