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

时间:2015-06-03 15:06:35

标签: wcf c#-4.0 automapper

我正在尝试使用AutoMapper将实体框架代码优先级映射到WCF DataContract类。

代码如下:

[DataContract]
public class User
{
    [DataMember]
    public int UserId { get; set; }
    [DataMember]
    public string UserName { get; set; }
    [DataMember]
    public string Password { get; set; }
    [DataMember]
    public string Email { get; set; }
    [DataMember]
    public DateTime DateCreated { get; set; }
    [DataMember]
    public int RoleId { get; set; }
}

public class User1
{
    public int UserId { get; set; }

    [StringLength(255, MinimumLength = 3)]
    public string UserName { get; set; }

    [StringLength(255, MinimumLength = 3)]
    public string Password { get; set; }

    [StringLength(255, MinimumLength = 3)]
    public string Email { get; set; }

    public DateTime DateCreated { get; set; }
    public int RoleId { get; set; }

    [ForeignKey("RoleId")]
    public virtual Role Role { get; set; }
}

public static T Get<T>(this object source) where T : class
{
    Mapper.CreateMap(source.GetType(), typeof(T));
    T destination = default(T);
    Mapper.Map(source, destination);
    return destination;
}

User user = new User();
User1 user1 = user.Get<User1>();

我在执行上面代码中的最后一行时遇到此异常:

  

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

     

映射类型:对象 - &gt;用户
  System.Object - &gt; DataLayer.User

     

目的地路径:用户

     

来源价值:Service.User

任何人都可以帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

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

映射类型:对象 - &gt;用户

这是因为您传递了object类型的值,创建了从基础类型User到类型User1的映射,然后将对象作为源传入,没有映射(并且提供的代码中的实际错误消息将引用User1而不是User

您可以使用Map的重载,它允许您告诉AutoMapper使用哪种类型:

Mapper.Map(source, destination, source.GetType(), typeof(T));

或者,如果您的代码允许,请使用Map的重载,它允许您告诉AutoMapper使用什么类型,以及创建目标对象本身:

 return (T)Mapper.Map(source, source.GetType(), typeof(T));

如果需要,您可能只想考虑创建映射,如下所示:

public static T Get<T>(this object source)
{
    if (Mapper.FindTypeMapFor(source.GetType(), typeof (T)) == null)
    {
        Mapper.CreateMap(source.GetType(), typeof (T));
    }

    return (T)Mapper.Map(source, source.GetType(), typeof(T));
}