我有一个奇怪的案例,对于AutoMapper来说我还很陌生,我不知道发生了什么。

我有两节课

public class Person
{
    public List<Friend> Friends {get;set;}
}

public class PersonView : Person
{
    public new List<FriendView> Friends {get;set;}
}

和地图

Mapper.CreateMap<Person, PersonView>().ForMember(d => d.Friends,
    o => o.ResolveUsing<FriendViewResolver>().FromMember(s => s.Friends));

但是,我也有这张地图,它有自己的地图:

Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);

现在,在FriendViewResolver内部-我为每个Mapper.Map<Friend, FriendView>()调用Mapper.Map<Friend, FriendView>() 但是由于某种原因,它运行后,某些属性会丢失,并且由于跳过代码,似乎AutoMapper在列表上进行了第二遍处理。

我想让FriendViewResolver在列表上运行,因为它正在对整个Friends集合进行递归操作,但是我不明白为什么如果成员有一个解析器规则,则AM要第二遍通过。

我真的希望这有意义。

编辑:当我运行Mapper.Map<Person, PersonView>();会发生问题Mapper.Map<Person, PersonView>(); ,我看到它运行FriendViewResolver并具有正确的结果,但是调试器中的下一步再次运行地图并弄乱了已映射的对象。

===============>>#1 票数:4

PersonView派生自Person。 那不是应该使用AutoMapper的方式。 它应该用于在不同的类之间进行映射。 您似乎要在此处执行的操作是,您有一个域模型Person,并且试图创建将在视图中使用的视图模型PersonView。 很好,这正是您应该做的,只是视图模型不应从域模型派生。 它是独立的。 然后,您可以使用AutoMapper在它们之间进行映射。

因此,您的PersonView类应如下所示:

public class PersonView
{
    public List<FriendView> Friends {get;set;}
}

现在您将有2个映射定义:

Mapper.CreateMap<Friend, FriendView>();
Mapper.CreateMap<Person, PersonView>();

并且当您拥有域模型(Person)的实例时,您将能够映射到视图模型(PersonView)。

===============>>#2 票数:0

我想你可以这样解决:

Mapper.CreateMap<Person, PersonView>();
Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);

<Person, PersonView>映射应自动尝试映射Friends属性,因为它们具有相同的名称。 <Friend, FriendView>映射应处理实际的属性映射。

  ask by Madd0g translate from so

未解决问题?本站智能推荐:

2回复

ASP.Net MVC C#AutoMapper使用Where语句

使用AutoMapper - 在将域映射到viewmodel时,可以使用where语句来限制映射到viewmodel的内容,例如。 我使用以下内容将商品列表映射到OfferVM视图模型: 但是,如果要约中的属性设置为true,我只想将要约列表中的项目映射到OfferVM,例如:
1回复

更改视图模型AutoMapper的映射规则

我有一个模特 和一个视图模型: 和控制器: 一切正常,但是...我有一些用于产品模型常规信息属性的获取逻辑,该属性从数据库获取此常规信息,有时,当产品没有常规信息时,此属性返回null。 我需要从可用属性(例如With,Height等)生成替代的常规信息。类似:
2回复

AutoMapper - 在viewmodel中映射子集合

我有一个viewmodel需要以分号分隔的文本框显示某个IEnumerable字段。 起初我想过使用DefaultModelBinder来转换它,但我很难想到如何在两个方向上实现它(dto < - > viewmodel)。 昵称是我试图显示为由分号分隔的一个文本框的字段。
5回复

字典 使用Automapper映射到对象

以下代码仅适用于此问题 我正在上课 我有一本字典 现在我想使用Automapper将User对象Automapper到此dictionary 。 Automapper映射对象的属性,但在我的例子中有一个字典和对象。 所以,请建议我怎么做
2回复

在ASP.Net MVC中使用AutoMapper的正确方法

我正在尝试开始使用ViewModels - 但是我遇到了这个POST无法验证的问题 - 模型中的值显示在代码下方的Watch部分中: ModelStats.IsValid = false 我的ItemViewModel是: 我相信这会很简单 - 但我一直在看它这么久,我无法
2回复

ASP.Net C#MVC问题使用AutoMapper将域模型映射到ViewModel

我在使用AutoMapper将域模型映射到视图模型时遇到了一些困难。 我的控制器代码是: 我在ovm.ObList = Mapper....上遇到错误(ObList在红色下划线标有错误): 'ObList': cannot reference a type through an
1回复

对对象的子属性执行OrderBy时出错

我在对对象的子属性执行OrderBy时遇到问题。 我有两个单独的模型,如下所示: PersonModel: DeptModel 我使用过自动映射器来映射这两个类之间的关系,并且能够正确检索数据。 检索数据后,我试图通过在DeptName对象上使用linq来实现顺
1回复

对使用AutoMapper感到困惑

我读了几篇文章,还看了MvcConf 1的视频,其中Jimmy Bogard演示了AutoMapper的用法,但我仍然感到困惑。 我有一个用户POCO类,它具有很多属性。 我还有一个RegisterViewModel类,其中包含User类的属性的子集。 现在,当用户注册时,她会将数据填
3回复

Automapper将空字符串清空

当我尝试映射具有空字符串属性的对象时,目标也为null。 我可以打开一个全局设置,说所有空字符串应该映射为空吗?
1回复

使用automapper的抽象类

我有一个基类: 然后,我想将我的视图模型映射到基于属性的这些子类之一: 基于UserVM.UserType,我想映射到相关的子类: 如何为此设置我的CreateMap配置?