为什么AutoMapper创建浅拷贝?

11

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

模型和数据传输对象设置

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。我是否配置错误?如何修复此问题?


请注意,标签[tag:model-view-controller]是用于关于模式的问题。您的问题涉及ASP.NET特定的实现,请改用[tag:asp.net-mvc]。 - Tieson T.
根据 @DavidHall 提供的博客文章,你所要求的解决方案是添加 "Mapper.CreateMap<MyStuff, MyStuff>();" 作为更多的配置。但是你在 AutoMapper 中发现的行为有点有趣并且值得注意。 - Prashant
顺便问一下,为什么MyStuff不是DTO呢? - Benedikt Schroeder
1个回答

14

你正在源对象和目标对象中都重用类型 "MyStuff"。当 AutoMapper 检测到两个可分配的类型时,它会进行赋值而不是复制。您可以通过创建显式映射来覆盖此行为:

Mapper.CreateMap<MyStuff, MyStuff>();

由于AutoMapper不是一个复制/克隆库,因此AutoMapper默认为分配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接