【问题标题】:"Missing map from System.Char to System.String" AutoMapper error“缺少从 System.Char 到 System.String 的映射”AutoMapper 错误
【发布时间】:2017-06-02 04:30:55
【问题描述】:

我正在尝试将我的Box 对象映射到我的BoxedElectrodesRowModel

Box 对象有一个属性SerialNumbers这些 中的每一个都有自己的SerialNumberName 属性。我正在尝试将 SerialNumberNames 列表映射到我的 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 类的定义?在列表中显示您正在映射的属性
  • 添加了我正在映射的类

标签: c# asp.net-mvc datatables automapper


【解决方案1】:

您的问题是FirstOrDefault() 电话。因为它仅从序列号名称返回第一个 string。但是字符串是IEnumerable&lt;char&gt;。当 AutoMapper 看到两个枚举时,它会尝试映射它们。在您的情况下,它将是 IEnumerable&lt;char&gt;IEnumerable&lt;string&gt;

要解决此问题,请删除 FirstOrDefault() 调用。因此 AutoMapper 知道如何将 IEnumerable&lt;T&gt; 映射到 List&lt;T&gt;,您无需手动创建列表。

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”
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2018-11-15
  • 2020-04-16
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
相关资源
最近更新 更多