2017-01-17 8 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

Целью всего этого является то, чтобы создать таблицу с помощью DataTables, который отображает каждый Box со списком из его SerialNumbers на каждой строке, если это помогает. Все закодировано, но я продолжаю получать вышеуказанную ошибку, когда она запускается.

Редактировать: Вот мои классы, которые я собираю. Я пытаюсь сопоставить BoxId с BoxId, DateCreated до DateCreated и SerialNumberName от каждого SerialNumber (в списке) до SerialNumbers.

Box (автоматически созданное)

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() call. Потому что он возвращает только первые string с именами серийных номеров. Но строка IEnumerable<char>. Когда AutoMapper видит два перечислимых объекта, он пытается их сопоставить. В вашем случае это будет IEnumerable<char> до IEnumerable<string>.

Для решения этой проблемы удалите FirstOrDefault() call. Таким образом, 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.

Я считаю, что виновником является вызов FirstOrDefault(), который при вызове на строку, возвращает первый символ в строке:

src.SerialNumbers.Select (т => 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" –

 Смежные вопросы

  • Нет связанных вопросов^_^