为什么AutoMapper会创建浅副本?

Kro*_*rol 6 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>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

模型和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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试代码

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

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

Jim*_*ard 9

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

Mapper.CreateMap<MyStuff, MyStuff>();
Run Code Online (Sandbox Code Playgroud)

AutoMapper 默认为赋值,因为 AutoMapper 不是复制/克隆库。