我正在尝试使用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
任何人都可以帮忙解决这个问题吗?
答案 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));
}