【发布时间】:2017-12-31 01:46:09
【问题描述】:
为具有多对多关系的 Person 和 Group 类创建图像。一个人有一个组列表,一个组有一个人员列表。
将Person 映射到PersonDTO 时,我有一个stack overflow exception,因为AutoMapper 无法处理Person>Groups>Members>Members>Groups>Members>...
下面是示例代码:
public class Person
{
public string Name { get; set; }
public List<Group> Groups { get; set; }
}
public class Group
{
public string Name { get; set; }
public List<Person> Members { get; set; }
}
public class PersonDTO
{
public string Name { get; set; }
public List<GroupDTO> Groups { get; set; }
}
public class GroupDTO
{
public string Name { get; set; }
public List<PersonDTO> Members { get; set; }
}
当我使用 .ForMember 创建映射器时,第一个执行的映射器会抛出 null reference exception。
这是映射器的代码:
CreateMap<Person, PersonDTO>()
.ForMember(x => x.Groups.Select(y => y.Members), opt => opt.Ignore())
.ReverseMap();
CreateMap<Group, GroupDTO>()
.ForMember(x => x.Members.Select(y => y.Groups), opt => opt.Ignore())
.ReverseMap();
那么我错过了什么或做错了什么?当我删除 .ForMember 方法时,null reference exception 不再被抛出。
更新:我真的想强调我的问题的要点是如何忽略一个属性的属性。这段代码只是一个比较简单的例子。
更新 2:这就是我修复它的方法,非常感谢Lucian-Bargaoanu
CreateMap<Person, PersonDTO>()
.ForMember(x => x.Groups.Select(y => y.Members), opt => opt.Ignore())
.PreserveReferences() // This is the solution!
.ReverseMap();
CreateMap<Group, GroupDTO>()
.ForMember(x => x.Members.Select(y => y.Groups), opt => opt.Ignore())
.PreserveReferences() // This is the solution!
.ReverseMap();
感谢.PreserveReferences() 修复了循环引用!
【问题讨论】:
-
谢谢@Esperadoce,但我的代码没有示例那么简单。我真的很想忽略 AutoMapper 中的 property of a property。
-
是的,你是对的,我删除了我的标志!
-
你为什么不直接使用
.ForMember(x => x.members, o => o.Ignore())? -
你的问题是循环引用所以检查这个stackoverflow.com/a/11505745/2954082
-
@Esperadoce 谢谢,我会试试的。
标签: c# entity-framework automapper stack-overflow nullreferenceexception