2017-01-20 1 views
0

Я использую AutoMapper для сопоставления свойств двух объектов вместе, но я получаю ошибкаПопытка сопоставить два свойства вместе, получив ошибку «LINQ to Entities не распознает метод» Метод System.String ToString() «

LINQ к Entities не распознает метод «System.String ToString()» метод, и этот метод не может быть переведен в выражение магазина.

Я действительно не понимаю, почему, потому что я не верю, что пытаюсь преобразовать что-либо в строку.

Вот мой AutoMapper код:

c.CreateMap<SerialNumber, SerialNumberModel>() 
    .ForMember(dest => dest.Name, opts => opts.MapFrom(src => src.SerialNumberName.FirstOrDefault())); 

c.CreateMap<Box, BoxedElectrodesRowModel>() 
    .ForMember(dest => dest.BoxId, opts => opts.MapFrom(src => src.BoxID)) 
    .ForMember(dest => dest.DateCreated, opts => opts.MapFrom(src => src.DateCreated)) 
    .ForMember(dest => dest.SerialNumbers, opts => opts.MapFrom(src => src.SerialNumbers)); 

Примечание: SerialNumber и SerialNumberModel объекты, вложенные в Box и BoxedElectrodesRowModel соответственно.

Первый блок, сопоставляющий серийные номера, является единственной частью со строками, и каждый Name и SerialNumberName уже является строкой, поэтому конверсии не должно происходить.

Единственная вещь, которую я могу думать что может быть причиной проблем является то, что в последней строке второго блока я пытаюсь сопоставить мой SerialNumbers список (из Name строк) в SerialNumbers ICollection в децибелах (из SerialNumberName строк). Я попытался противодействовать этому, изменив свой список на ICollection, чтобы они совпадали, но у меня все еще есть ошибка. Я также попытался добавить .ToList() к последней строке, по той же причине, но это тоже не сработало.

Edit: Вот классы:

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

SerialNumberModel

public class SerialNumberModel 
{ 
    public string Name { get; set; } 
} 

Box (A токоррекция сгенерированный)

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

BoxedElectrodesRowModel

public class BoxedElectrodesRowModel 
{ 
    public int BoxId { get; set; } 
    public List<SerialNumberModel> SerialNumbers { get; set; } 
    public Nullable<System.DateTime> DateCreated { get; set; } 
} 
+0

I [ответил] (http://stackoverflow.com/questions/41753827/getting-automapper-error-when-trying-to-map-nested-objects/41754183#41754183) Ваш вопрос вчера. Разве это не помогло? Плюс почему вы используете 'src.SerialNumberName.FirstOrDefault()'? – CodingYoshi

+0

Я не знаю, потому что это привело к этой новой ошибке. Я не знаю, является ли это шагом вперед или назад. Я могу согласиться с этим, хотя, по крайней мере, я больше не получаю старую ошибку. –

+1

Почему вы делаете 'FirstOrDefault()'?Какую ошибку вы пытаетесь решить? – CodingYoshi

ответ

0

Дайте ему идти, я добавил обратное отображение в. Нет необходимости вручную сообщать automapper о свойствах, имеющих одно и то же имя.

c.CreateMap<SerialNumber, SerialNumberModel>() 
    .ForMember(dest => dest.Name, opts => opts.MapFrom(src => src.SerialNumberName)); 
    c.CreateMap<SerialNumberModel, SerialNumber>() 
    .ForMember(dest => dest.SerialNumberName, opts => opts.MapFrom(src => src.Name)); 

c.CreateMap<Box, BoxedElectrodesRowModel>(); 
c.CreateMap<BoxedElectrodesRowModel, Box>(); 
+0

Я пробовал это, но я получаю то же самое «LINQ to Entities не распознает метод» Ошибка System.String ToString() –

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