我有以下模型(和相应的 DTO):
public class Link
{
public int Id {get; set;}
public int FirstLinkId {get; set;}
public int SecondLinkId {get; set;}
public virtual Link FirstLink {get; set;}
public virtual Link SecondLInk {get; set;}
}
public class OtherObject
{
public int Id {get; set;}
public int LinkId {get; set;}
public string Name {get; set;}
public virtual Link Link {get; set;}
}
在我的场景中,我可以有一个
Link
对象,其中 FirstLink
和/或 SecondLink
可以为 null、对其他对象的引用或对同一对象的引用。现在我想使用 EF 从 db 加载一个
OtherObject
实体。我加载实体本身以及与之关联的 Link
对象。这由 EF 完美完成。在这种特殊情况下,
FirstLink
和 SecondLink
都与 Link
相同,因此,当从模型自动映射到 dto 时,它只会继续映射到遗忘中。我的映射是:
Mapper.CreateMap<OtherObject, OtherObjectDto>().Bidirectional()
.ForMember(model => model.LinkId, option => option.Ignore());
其中 Bidirectional() 是这个扩展:
public static IMappingExpression<TDestination, TSource> Bidirectional<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
return Mapper.CreateMap<TDestination, TSource>();
}
有没有办法告诉 Automapper 在这种情况下不要进一步映射到树?
最佳答案
我处理这个问题的方法是为 children 创建单独的 DTO 对象:
public class Employee
{
public int Id {get; set;}
public string Name { get; set; }
public Employee Supervisor {get; set; }
}
public class EmployeeDto {
public int Id {get; set;}
public string Name { get; set; }
public SupervisorDto Supervisor { get; set; }
public class SupervisorDto {
public int Id {get; set;}
public string Name { get; set; }
}
}
Mapper.CreateMap<Employee, EmployeeDto>();
Mapper.CreateMap<Employee, EmployeeDto.SupervisorDto>();
不要让你的 DTO 是递归的/自引用的。在你的结构中明确你想要它的深度。
EF 不能进行递归连接,你只做一个级别,所以不要让你的 DTO 陷入无限深的关系。明确一点。
关于c# - 如何使用 AutoMapper 避免循环引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28763042/