2015-07-25 16 views
6

Tôi mới sử dụng AutoMapper và, trừ khi tôi hiểu nhầm, AutoMapper sẽ luôn tạo bản sao sâu khi ánh xạ tới Dto. Tuy nhiên, mã thử nghiệm sau đây cho tôi thấy rằng nó tạo ra các bản sao nông. Tôi đang thiếu gì ở đây?Tại sao AutoMapper tạo bản sao nông nghiệp?

Mapping Config

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using AutoMapper; 
using Sandbox.Models; 

namespace Sandbox.Core.Automapper 
{ 
    public static class AutoMapperWebConfiguration 
    { 
     public static void Configure() 
     { 
      ConfigureUserMapping(); 
     } 

     private static void ConfigureUserMapping() 
     { 
      Mapper.CreateMap<Home, HomeDto>(); 
     } 
    } 
} 

Model và dto Cài đặt

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace Sandbox.Models 
{ 
    public class Home 
    { 
     public int Price { get; set; } 
     public int Price2 { get; set; } 
     public MyStuff Stuff{ get; set; } 
    } 

    public class HomeDto 
    { 
     public int Price { get; set; } 
     public int Price2 { get; set; } 
     public MyStuff Stuff{ get; set; } 
    } 

    public class MyStuff 
    { 
     public int Abba { get; set; } 
    } 
} 

Kiểm tra Mã

var home = new Home(); 
home.Stuff= new MyStuff(){Abba = 1}; 
var homeDto = Mapper.Map<HomeDto>(home); 
homeDto.MyStuff.Abba = 33; 

Sau Modi fying homeDto của Abba giá trị đến 33, giá trị Abba của nhà cũng thay đổi đến 33. Tôi đã cấu hình sai một cái gì đó? Tôi phải làm gì để sửa lỗi này?

+1

có thể trùng lặp của [Tự động trả về tham chiếu đến cùng một đối tượng khi ánh xạ chuỗi tới mảng] (http://stackoverflow.com/questions/28874357/automapper-returns-reference-to-the-same-object-when-mapping -Số-tới-mảng) –

+0

Xin lưu ý rằng thẻ [tag: model-view-controller] dành cho các câu hỏi về mẫu * *. Câu hỏi của bạn là về việc triển khai ASP.NET cụ thể, vì vậy hãy sử dụng [tag: asp.net-mvc] để thay thế. –

+0

theo bài đăng trên blog được đưa ra bởi giải pháp @DavidHall cho những gì bạn đang yêu cầu là thêm "Mapper.CreateMap ();" càng nhiều cấu hình. Nhưng hành vi những gì bạn tìm thấy trong tự động bản đồ là một loại thú vị và quan trọng cần lưu ý. – Prashant

Trả lời

2

Bạn đang sử dụng lại một loại trên cả đối tượng nguồn và đích, "MyStuff". Khi AutoMapper thấy hai loại có thể gán, nó chỉ định chúng thay vì sao chép chúng. Bạn có thể ghi đè hành vi này bằng cách tạo bản đồ rõ ràng:

Mapper.CreateMap<MyStuff, MyStuff>(); 

AutoMapper mặc định gán, vì AutoMapper không phải là thư viện sao chép/nhân bản.

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