如何使用自引用对象避免递归Automapper调用?

时间:2012-10-10 19:40:17

标签: c# .net automapper

我有一个班级员工:

public partial class Employee
{
    public Employee()
    {
        this.Employees1 = new HashSet<Employee>();
    }

    public int Id { get; set; }
    public string Surname { get; set; }
    public string Email { get; set; }
    public Nullable<int> ReportsToId { get; set; }

    public virtual ICollection<Employee> Employees1 { get; set; }
    public virtual Employee ReportsTo { get; set; }
}

这是一个视图模型:

public class EmployeeEditModel : MappedViewModel<Employee>
{
    public int Id { get; set; }
    public string Surname { get; set; }
    public string FirstName { get; set; }
    public string Email { get; set; }
    public int? ReportsTo { get; set; }
}

MappedViewModel<T>声明了一种方法:

public class MappedViewModel<TEntity>: ViewModel
{
    public virtual TEntity MapToEntity()
    {
        return (TEntity)Mapper.Map(this, GetType(), typeof(TEntity));
    }
}

当我在动作方法中调用MapToEntity时,就这样

我从AutoMapper获得一个例外消息:

  

缺少类型映射配置或不支持的映射。

     

映射类型:Int32 - &gt; Employee System.Int32 - &gt; Leave.Data.Employee

     

目标路径:Employee.ReportsTo.ReportsTo

     

来源价值:5

我的映射定义如下:

public static void RegisterMaps()
{
    Mapper.CreateMap<Employee, EmployeeCreateModel>();
    Mapper.CreateMap<EmployeeCreateModel, Employee>();
}

双重引用Employee.ReportsTo.ReportsTo向我尖叫,这个异常是由某种循环映射怪癖引起的,但我能怎么做呢?至少我想从映射中省略ReportsTo,只需在调用MapToEntity后手动执行此操作。我怎么能对此,甚至我应该为这种AutoMapper问题模式做些什么呢?

1 个答案:

答案 0 :(得分:0)

您需要做的不仅仅是简单Mapper.CreateMap,因为它不会神奇地弄清楚如何在EmployeeViewModel.ReportsToint?)和Employee.ReportsTo之间进行转换({{1} })。

Employeeint之间创建映射,或使用Employee方法告诉AutoMapper如何转换ForMember属性。