Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用AutoMapper映射后不丢失目标对象中存在但源对象中不存在的属性_C#_.net_Automapper - Fatal编程技术网

C# 如何在使用AutoMapper映射后不丢失目标对象中存在但源对象中不存在的属性

C# 如何在使用AutoMapper映射后不丢失目标对象中存在但源对象中不存在的属性,c#,.net,automapper,C#,.net,Automapper,我的班级结构如下: public class A { public bool Property1 { get; set; } public bool Property2 { get; set; } } public class ContainerForA { public A A { get; set; } } public class A1 { public bool Property1 { get; set; } } public class Conta

我的班级结构如下:

public class A
{
    public bool Property1 { get; set; }
    public bool Property2 { get; set; }
}

public class ContainerForA
{
    public A A { get; set; }
}

public class A1
{
    public bool Property1 { get; set; }
}

public class ContainerForA1
{
    public A1 A { get; set; }
}
我为这组类创建了一个映射:

Mapper.CreateMap<A1, A>();
Mapper.CreateMap<ContainerForA1, ContainerForA>();
        var cnt_a = new ContainerForA()
                        {
                            A = new A()
                                    {
                                        Property1 = false,
                                        Property2 = true
                                    }
                        };

        var cnt_a1 = new ContainerForA1()
                         {
                             A = new A1()
                                     {
                                         Property1 = true
                                     }
                         };
如果我调用
Mapper.Map(cnt_a1.A,cnt_A.A)
我得到了我期望的结果:对象cnt_A的两个属性(
Property1
Property2
)都是true


但是如果我调用
Mapper.Map(cnt_a1,cnt_a)
我得到的是
Property1
的true和
Property2
的false。有人能解释一下为什么吗?我是否可以选择以这种方式声明我的映射,这样我就不会丢失目标对象中存在但不在源对象中的属性?

我猜,当您从
ContainerForA1
映射到
ContainerForA
时,当映射属性A时,它为
ContainerForA
创建
a
的新实例,而不是使用现有实例。这将使用所有属性的默认值,对于
bool
,默认值为
false

我们如何解决这个问题

首先,我们需要告诉AutoMapper不要覆盖ContainerForA上的属性A。为此,我们将告诉AutoMapper忽略该属性

Mapper.CreateMap<ContainerForA1, ContainerForA>()
    .ForMember(cForA => cForA.A, option => option.Ignore());
Mapper.CreateMap()
.ForMember(cForA=>cForA.A,option=>option.Ignore());
现在我们需要使用AfterMap手动更新

Mapper.CreateMap<ContainerForA1, ContainerForA>()
    .ForMember(cForA => cForA.A, option => option.Ignore())
    .AfterMap((cForA1, cForA) => Mapper.Map(cForA1.A, cForA.A));
Mapper.CreateMap()
.ForMember(cForA=>cForA.A,option=>option.Ignore())
.AfterMap((cForA1,cForA)=>Mapper.Map(cForA1.A,cForA.A));

您可能希望向AfterMap方法添加一些检查,以确保cForA.A不为null。我将把它留给您。

在这种情况下,当我们将cnt_a1.A映射到cnt_A.A时,为什么不丢失所有属性?我建议将Property2设置为false,因为它也应该用默认值实例化..当您将cnt_a1.A映射到cnt_A.A时,您已经有了每个对象的实例,并且它正在映射属性。如果您要执行类似于
aa=Mapper.Map(cnt_a1.A)的操作您将看到a.Property2为false,因为它正在创建一个新的a。我刚刚注意到AfterMap lambda表达式中我的示例代码中有一个bug,我已经纠正了它。您在“每个对象都已经有一个实例”下的意思是什么?在Mapper.Map(cnt_a1,cnt_a)/Mapper.Map(cnt_a1.a,cnt_a.a)过程中,似乎有相同的对象。唯一的区别在于我应用映射到的对象。。