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

Missing type map configuration or unsupported mapping - AutoMapper

我正在尝试使用 AutoMapper 将 Entity Framework Code First class 映射到 WCF DataContract class。

代码如下:

[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>();

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

Missing type map configuration or unsupported mapping.

Mapping types: Object -> User
System.Object -> DataLayer.User

Destination path: User

Source value: Service.User

谁能帮忙解决这个问题?

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

映射类型:对象 -> 用户

这是因为您要传递类型 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));
}