为什么AutoMapper会创建浅副本?

时间:2015-07-25 05:27:34

标签: c# asp.net-mvc automapper

我是AutoMapper的新手,除非我误解,否则AutoMapper在映射到Dto时应始终创建深层副本。然而,以下测试代码向我展示它正在创建浅拷贝。我在这里缺少什么?

映射配置

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

模型和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; }
    }
}

测试代码

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

将homeDto的Abba值修改为33后,home的Abba值也变为33.我是否错误配置了某些内容?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:3)

您在源和目标对象“MyStuff”上重复使用类型。当AutoMapper看到两个可分配类型时,它会分配它们而不是复制它们。您可以通过创建显式映射来覆盖此行为:

Mapper.CreateMap<MyStuff, MyStuff>();

AutoMapper默认为分配,因为AutoMapper不是复制/克隆库。