【发布时间】:2018-10-01 02:42:03
【问题描述】:
我在使用 AutoMapper 时遇到了一些问题,我映射的对象进行循环引用,因此我无法使用 ActionResult 将其 JSON 返回给 View。
我已经将一个 DTO 的对象与另外两个链接在一起。
public class MasterJobsDTO
{
public int function_id { get; set; }
public string function_name { get; set; }
public bool is_active { get; set; }
public job_family job_family
{
get; set;
}
public functional_area functional_area
{
get; set;
}
}
功能模式:
public partial class function
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public function()
{
this.t_actual_organization = new HashSet<t_actual_organization>();
this.t_actual_organization_split_position = new HashSet<t_actual_organization_split_position>();
}
public int function_id { get; set; }
public string function_name { get; set; }
public bool is_active { get; set; }
public Nullable<int> job_family_id { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<t_actual_organization> t_actual_organization { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<t_actual_organization_split_position> t_actual_organization_split_position { get; set; }
public virtual job_family job_family { get; set; }
}
Job_Family 模型:
public partial class job_family
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public job_family()
{
this.t_actual_organization = new HashSet<t_actual_organization>();
this.t_actual_organization_split_position = new HashSet<t_actual_organization_split_position>();
this.functions = new HashSet<function>();
}
public int job_family_id { get; set; }
public string job_family_name { get; set; }
public Nullable<int> functional_area_id { get; set; }
public virtual functional_area functional_area { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<t_actual_organization> t_actual_organization { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<t_actual_organization_split_position> t_actual_organization_split_position { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<function> functions { get; set; }
}
自动映射器配置:
cfg.CreateMap<function, MasterJobsDTO>().MaxDepth(1).PreserveReferences()
.ForMember(x => x.functional_area_id, opts => opts.MapFrom(source => source.job_family.functional_area.functional_area_id))
.ForMember(x => x.functional_area_extended_name, opts => opts.MapFrom(source => source.job_family.functional_area.functional_area_extended_name))
.ForMember(x => x.job_family_name, opts => opts.MapFrom(source => source.job_family.job_family_name))
.ForMember(x => x.functional_area, opts => opts.MapFrom(source => source.job_family.functional_area))
;
function_area 类:
public partial class functional_area
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public functional_area()
{
this.job_family = new HashSet<job_family>();
this.t_actual_organization = new HashSet<t_actual_organization>();
this.t_actual_organization_split_position = new HashSet<t_actual_organization_split_position>();
}
public int functional_area_id { get; set; }
public string functional_area_name { get; set; }
public string functional_area_extended_name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<job_family> job_family { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<t_actual_organization> t_actual_organization { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<t_actual_organization_split_position> t_actual_organization_split_position { get; set; }
}
还有电话:
List<MasterJobsDTO> mjd = Mapper.Map<List<function>, List<MasterJobsDTO>>(data);
我在浏览器中得到的错误是:
在序列化“System.Data.Entity.DynamicProxies.job_family_D3FE2013BDB6002B7BE94915E73AEA531401...”类型的对象时检测到循环引用...
谢谢!
【问题讨论】:
标签: c# .net api entity automapper