“缺少从 System.Char 到 System.String 的映射”AutoMapper 错误
Posted
技术标签:
【中文标题】“缺少从 System.Char 到 System.String 的映射”AutoMapper 错误【英文标题】:"Missing map from System.Char to System.String" AutoMapper error 【发布时间】:2017-06-02 04:30:55 【问题描述】:我正在尝试将我的Box
对象映射到我的BoxedElectrodesRowModel
。
Box
对象有一个属性SerialNumbers
,这些 中的每一个都有自己的SerialNumberName
属性。我正在尝试将 SerialNumberName
s 列表映射到我的 BoxedElectrodeRowModel
中名为 SerialNumbers
的字符串列表。
AutoMapper 代码
c.CreateMap<Box, BoxedElectrodesRowModel>()
.ForMember(dest => dest.BoxId, opts => opts.MapFrom(src => src.BoxID))
.ForMember(dest => dest.SerialNumbers, opts => opts.MapFrom(src => src.SerialNumbers.Select(t => t.SerialNumberName).FirstOrDefault().ToList()))
.ForMember(dest => dest.DateCreated, opts => opts.MapFrom(src => src.DateCreated));
这是我现在遇到的错误。我不知道它指的是什么“字符”。
缺少从 System.Char 到 System.String 的映射。使用创建 Mapper.CreateMap
所有这些的目的是使用 DataTables 创建一个表,该表显示每个 Box
以及每行上的 SerialNumbers
列表,如果有帮助的话。一切都已编码,但运行时我不断收到上述错误。
编辑:这是我正在映射的类。我正在尝试将BoxId
映射到BoxId
,将DateCreated
映射到DateCreated
,并将每个SerialNumber
(在列表中)的SerialNumberName
映射到SerialNumbers
。
框(自动生成)
public partial class Box
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Box()
this.SerialNumbers = new HashSet<SerialNumber>();
public int BoxID get; set;
public System.DateTime DateCreated get; set;
public Nullable<System.DateTime> DateShipped get; set;
public string TrackingNumber get; set;
public Nullable<System.DateTime> DateReceived get; set;
public bool Active get; set;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<SerialNumber> SerialNumbers get; set;
序列号(这是每个“盒子”的属性,也是自动生成的代码)
public partial class SerialNumber
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public SerialNumber()
this.Comments = new HashSet<Comment>();
this.WIPHistories = new HashSet<WIPHistory>();
public int SerialNumberID get; set;
public int IncomingLotID get; set;
public string SerialNumberName get; set;
public string LamPurchaseOrder get; set;
public string LamLineNumber get; set;
public bool Refurbished get; set;
public int WIPLocationID get; set;
public int StatusID get; set;
public int RouteSectionStepID get; set;
public Nullable<int> RejectCategoryID get; set;
public Nullable<int> BoxID get; set;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Comment> Comments get; set;
public virtual IncomingLot IncomingLot get; set;
public virtual RejectCategory RejectCategory get; set;
public virtual Status Status get; set;
public virtual WIPLocation WIPLocation get; set;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<WIPHistory> WIPHistories get; set;
public virtual Box Box get; set;
public virtual RouteSectionStep RouteSectionStep get; set;
BoxedElectrodesRowModel
public class BoxedElectrodesRowModel
public int BoxId get; set;
public List<string> SerialNumbers get; set; // change from List to ICollection if there are problems
public Nullable<System.DateTime> DateCreated get; set;
【问题讨论】:
您能否发布您的 Box 和 BoxedElectrodesRowModel 类的定义?在列表中显示您正在映射的属性 添加了我正在映射的类 【参考方案1】:您的问题是FirstOrDefault()
电话。因为它仅从序列号名称返回第一个 string
。但是字符串是IEnumerable<char>
。当 AutoMapper 看到两个枚举时,它会尝试映射它们。在您的情况下,它将是 IEnumerable<char>
到 IEnumerable<string>
。
要解决此问题,请删除 FirstOrDefault()
调用。因此 AutoMapper 知道如何将 IEnumerable<T>
映射到 List<T>
,您无需手动创建列表。
opts => opts.MapFrom(src => src.SerialNumbers.Select(t => t.SerialNumberName))
【讨论】:
这让我更进一步,但现在我有这个错误:“DbSortClause 表达式必须有一个顺序可比的类型。参数名称:key”。我之前也遇到过这个错误,我认为添加“FirstOrDefault”应该可以解决它 @NathanR 此错误与OrderBy
调用数据库有关。但是我在您的映射中没有看到这样的代码。你在其他地方做OrderBy
?
见底部的Edit 2,我添加了发生最新错误的代码。
@NathanR 我回滚了您的编辑,因为它显示了与 “缺少从 System.Char 到 System.String 的映射”AutoMapper 错误 无关的完全不同的问题作为您的标题问题说。我建议您使用与可查询扩展使用相关的代码和您现在拥有的新错误创建另一个问题【参考方案2】:
我认为该问题已在错误消息中突出显示。
Automapper 被告知从字符对象 System.Char 映射到字符串对象 System.String。
我认为罪魁祸首是对 FirstOrDefault() 的调用,当在字符串上调用它时,将返回字符串中的第一个 Char:
src.SerialNumbers.Select(t => t.SerialNumberName).FirstOrDefault().ToList()
select 语句从 'SerialNumbers' 集合中选择一个字符串,这是 'MapFrom' 调用所需要的......所以您不需要调用 .FirstOrDefault 或 .ToList()。
删除它们,看看效果如何:
c.CreateMap<Box, BoxedElectrodesRowModel>()
.ForMember(dest => dest.BoxId, opts => opts.MapFrom(src => src.BoxID))
.ForMember(dest => dest.SerialNumbers, opts => opts.MapFrom(src => src.SerialNumbers.Select(t => t.SerialNumberName)))
.ForMember(dest => dest.DateCreated, opts => opts.MapFrom(src => src.DateCreated));
还有一篇关于这个问题的帖子:
AutoMapper: Collection to Single string Property
【讨论】:
我现在收到错误消息“DbSortClause 表达式必须具有顺序可比的类型。参数名称:key”以上是关于“缺少从 System.Char 到 System.String 的映射”AutoMapper 错误的主要内容,如果未能解决你的问题,请参考以下文章