2015-06-03 122 views
0

我想使用AutoMapper将实体框架代码第一类映射到WCF DataContract类。缺少类型映射配置或不支持的映射 - AutoMapper

的代码如下:

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

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

在执行中的最后一行中上面的代码我正在此异常。

映射类型:对象 - >用户
System.Object的 - > DataLayer.User

目标路径:用户

来源值:Service.User

任何人都可以在得到帮助这解决了吗?

回答

1

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

映射类型:对象 - >用户

这是因为要传递object类型的值,创建从底层类型User的映射输入User1,然后在该对象通过作为源,并且不存在映射(并且来自提供的代码的实际错误消息将参考User1而不是User

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

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

或者,如果你的代码允许,使用地图的过载这允许你告诉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)); 
} 
相关问题