C# 是否支持Automapper映射到同一对象上的self和更平坦/执行映射

C# 是否支持Automapper映射到同一对象上的self和更平坦/执行映射,c#,automapper,C#,Automapper,我有一棵物体树。我想用一些默认值更新对象,并展平一些属性。 但是,我不想创建新对象,只需更新现有树即可。 所以我想。我可以用大量的逻辑和递归来实现。或者我可以用自动映射器试试。基本上映射到self。automapper可能会使用源更新目标。并进行奉承: 源/目标类型 公共类Foo { 公共bool SomeBool{get;set;} 公共IEnumerable条{get;set;} } 公共类酒吧 { public bool somebool带有{get;set;} } 映射配置 var c

我有一棵物体树。我想用一些默认值更新对象,并展平一些属性。 但是,我不想创建新对象,只需更新现有树即可。 所以我想。我可以用大量的逻辑和递归来实现。或者我可以用自动映射器试试。基本上映射到self。automapper可能会使用源更新目标。并进行奉承:

源/目标类型
公共类Foo
{
公共bool SomeBool{get;set;}
公共IEnumerable条{get;set;}
}
公共类酒吧
{
public bool somebool带有{get;set;}
}
映射配置
var config=new-MapperConfiguration(cfg=>
{
CreateMap();
cfg.CreateMap()
.ForMember(dest=>dest.someboolWithdefalling,opt=>opt.MapFrom(src=>true));
});
var mapper=config.CreateMapper();
var foo=新foo
{
Bars=新列表{new Bar()}
};
mapper.Map(foo,foo);
版本: 9.0.0

预期行为 我希望用默认值更新条形图。foo和bars与以前是同一个对象

实际行为 但我得到的只是空酒吧

如果我:

var newFoo=mapper.Map(foo);
然后我得到一个新的foo,更新了条

我知道应该使用自动映射器来创建新对象。但事实并非如此。用例有效吗?仅在目的地进行奉承

复制步骤

班级计划
{
静态void Main(字符串[]参数)
{
var config=new-MapperConfiguration(cfg=>
{
CreateMap();
cfg.CreateMap()
.ForMember(dest=>dest.someboolWithdefalling,opt=>opt.MapFrom(src=>true));
});
var mapper=config.CreateMapper();
var foo=新foo
{
Bars=新列表{new Bar()}
};
var newFoo=mapper.Map(foo);//好的条形图,但有新的对象
Map(foo,foo);//相同的foo,但没有条
Console.WriteLine(foo.bar.First().SomeBoolWithDefalting);
}
}

简短回答:映射到现有集合时,AutoMapper首先清除目标集合


解释 让我们将
名称
属性添加到
类:

公共类栏
{
公共字符串名称{get;set;}
public bool somebool带有{get;set;}
}
然后运行下面的映射代码段:

var newFoo=newFoo
{
条=新列表
{
新酒吧
{
Name=“将被映射的条。”,
},
},
};
var notEmptyFoo=newfoo()
{
条=新列表
{
新酒吧
{
Name=“将被删除的条。”,
}
},
};
Console.WriteLine(notEmptyFoo.bar.First().Name);
Map(newFoo,notEmptyFoo);
Console.WriteLine(notEmptyFoo.bar.First().Name);
上面的代码从一个已存在的Foo条映射到另一个也已存在的Foo条。但是,在映射过程开始之前,AutoMapper将从目标
Foo
(在代码段
notEmptyFoo
中命名)中删除所有
Bar

控制台输出将显示:

Bar that will be removed.
Bar that will be mapped.
因此,当您从同一个
Foo
映射到同一个
Foo
时,不仅要在映射之前清除目标
Foo
条,还要清除源
Foo
以及它是同一个
Foo
对象!因此,在清除之后,源
Foo
中没有要映射的条,因为它刚刚被清除


如果希望保留目标集合的元素,请查看project。在那里,您可以设置一个EqualityComparison,告诉AutoMapper在集合之间映射时如何识别相同的元素。

很有趣。谢谢我现在明白了。。。我会看看收藏。再次感谢:-)您应该将其标记为问题的答案,至少是有用的,或者两者兼而有之。