2015-07-25 20 views
6

Jestem nowy w AutoMapper i, o ile się nie mylę, AutoMapper powinien zawsze tworzyć głębokie kopie podczas mapowania do DTO. Jednak poniższy kod testowy pokazuje mi, że tworzy płytkie kopie. Czego tu mi brakuje?Dlaczego AutoMapper tworzy płytkie kopie?

Mapowanie 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>(); 
     } 
    } 
} 

modelu i konfiguracji Dto

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; } 
    } 
} 

kod testowy

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

Po Modi zmieniając wartość homeba do Abby na 33, wartość domowego abby również zmieni się na 33. Czy coś źle skonfigurowałem? Co muszę zrobić, żeby to naprawić?

+1

możliwy duplikat [Automapper zwraca odniesienie do tego samego obiektu podczas mapowania sekwencji do tablic] (http://stackoverflow.com/questions/28874357/automapper-returns-reference-to-the-same-object-when-mapping -sekwencje-do-tablic) –

+0

Pamiętaj, że tag [tag: model-view-controller] jest przeznaczony do pytań dotyczących * wzorca *. Twoje pytanie dotyczy implementacji specyficznej dla ASP.NET, więc użyj [tag: asp.net-mvc]. –

+0

według wpisu na blogu podanego przez @DavidHall rozwiązanie do tego, o co prosisz, to dodanie "Mapper.CreateMap ();" jak więcej konfiguracji. Ale zachowanie, które znalazłeś w auto-odwzorowaniu, jest interesujące i ważne. – Prashant

Odpowiedz

2

Powtarzasz typ na obiekcie źródłowym i docelowym "MyStuff". Kiedy AutoMapper widzi dwa typy, które można przypisać, przypisuje je, a nie kopiuje. Można to zmienić poprzez stworzenie wyraźnej mapę:

Mapper.CreateMap<MyStuff, MyStuff>(); 

AutoMapper do przypisywania domyślnych, jak AutoMapper nie jest kopiowanie/library klonowania.