2017-01-17 40 views
1

我試圖將我的Box對象映射到我的BoxedElectrodesRowModel「缺少從System.Char到System.String的映射」AutoMapper錯誤

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

這裏是我現在得到的錯誤。我不知道它指的是什麼「字符」。

Missing map from System.Char to System.String. Create using Mapper.CreateMap

這一切的目的是創建使用其每行SerialNumbers的列表顯示了每個Box數據表的表,有沒有什麼幫助。一切都是編碼的,但是當它運行時我總是收到上述錯誤。

編輯:這是我正在繪製的課程。我試圖將BoxId映射到BoxId,DateCreatedDateCreatedSerialNumberName從每個SerialNumber(在列表中)到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; } 
} 

的SerialNumber(這是每個 '箱' 的屬性,也自動生成的代碼)

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; } 
} 
+0

能否請您發表您的方塊和BoxedElectrodesRowModel類的定義是什麼?在列表中顯示您正在映射的屬性 –

+0

添加了我正在映射的類 –

回答

0

您的問題是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)) 
+0

這使我進一步了一點,但現在出現此錯誤:「DbSortClause表達式必須具有可比較的類型 參數名稱:key」。我之前也得到了這個錯誤,我認爲增加「FirstOrDefault」應該解決它 –

+0

@NathanR這個錯誤與'OrderBy'調用數據庫有關。但是我沒有在你的映射中看到這樣的代碼。你在別的地方做'OrderBy'嗎? –

+0

請參閱編輯2的底部,我添加了最新的錯誤發生的代碼。 –

0

我認爲這個問題在錯誤信息中突出顯示。

Automapper被告知將字符對象System.Char映射到字符串對象System.String。

相信罪魁禍首是調用FirstOrDefault(),它在一個字符串調用時,將返回字符串中的第一個字符:

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

+0

現在我得到錯誤「DbSortClause表達式必須有一個類似命令的類型參數名稱:key」 –

相關問題