我是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.我是否错误配置了某些内容?我该怎么做才能解决这个问题?
答案 0 :(得分:3)
您在源和目标对象“MyStuff”上重复使用类型。当AutoMapper看到两个可分配类型时,它会分配它们而不是复制它们。您可以通过创建显式映射来覆盖此行为:
Mapper.CreateMap<MyStuff, MyStuff>();
AutoMapper默认为分配,因为AutoMapper不是复制/克隆库。