2017-01-17 9 views
1

BoxオブジェクトをBoxedElectrodesRowModelにマップしようとしています。「System.CharからSystem.Stringへのマップがありません」AutoMapperエラー

BoxオブジェクトプロパティSerialNumbersを有し、の各々は、それらSerialNumberNameの独自の特性を有しています。 SerialNumberNameのリストを、SerialNumbersと呼ばれるBoxedElectrodeRowModelの文字列リストにマップしようとしています。

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を表示するのDataTableを使用してテーブルを作成することです。すべてがコード化されていますが、実行時に上記のエラーが発生します。

編集:ここには私のマッピングがあります。私はBoxIdBoxIdに、DateCreatedDateCreatedに、SerialNumberNameをそれぞれ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が2つの列挙子を見ると、それらをマップしようとします。あなたの場合、IEnumerable<char>IEnumerable<string>になります。

この問題を解決するには、FirstOrDefault()コールを削除してください。また、AutoMapperはIEnumerable<T>List<T>にマップする方法を知っているので、手動でリストを作成する必要はありません。

opts => opts.MapFrom(src => src.SerialNumbers.Select(t => t.SerialNumberName)) 
+0

もう少しですが、このエラーが発生しました: "DbSortClause式の型が同等である必要があります。 パラメータ名:キー"私もこのエラーが発生しました。私は "FirstOrDefault"を追加するとその問題を解決するはずです。 –

+0

@NathanRこのエラーはデータベースへの 'OrderBy'呼び出しに関連しています。しかし、私はあなたのマッピングにそのようなコードが表示されません。あなたはどこかで 'OrderBy'をやっていますか? –

+0

下部の2を参照してください。最新のエラーが発生している場所にコードを追加しました。 –

0

エラーメッセージに問題が強調表示されていると思います。

Automapperは、文字オブジェクトSystem.Charを文字列オブジェクトSystem.Stringにマップするよう指示されています。

src.SerialNumbers.Select(トン=> t.SerialNumberName):私は犯人が文字列で呼び出さFirstOrDefault()を呼び出し、あると信じて

は、文字列の最初の文字を返します。 FirstOrDefault()。

select文は、 'MapFrom'呼び出しに必要なものである 'SerialNumbers'コレクションからStringを選択します。したがって、.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式には類似した型が必要です。 –

関連する問題