Automapper работает только иногда

Я создал веб-API, который возвращает список DTO, я использую automapper для сопоставления списка объектов, созданных с помощью Entity Framework db, с первым подходом к моим объектам DTO. Иногда работает, иногда нет (странное поведение), в большинстве случаев возвращает null. Пожалуйста, взгляните на пример кода.

  public IEnumerable<RemarkHeaderViewModel> Get()
        {
            Mapper.CreateMap<RemarkHeader, RemarkHeaderViewModel>();
           //dbremarkdata have list of RemarkHeader
            var dbremarkdata = db.RemarkHeaders.ToList();

            //works sometimes, most of time return null
             var remarkHeaderVm = Mapper.Map<List<RemarkHeader>, List<RemarkHeaderViewModel>>(dbremarkdata);

            return remarkHeaderList;
        }

RemarkViewModel.cs

public partial class RemarkViewModel
    {

        public int RemarkId { get; set; }
        public int RemarkHeaderId { get; set; }
        public string RemarkBody { get; set; }
        public virtual RemarkHeaderViewModel RemarkHeaderViewModel { get; set; }
    }

Remark.cs Создан платформой сущностей

public partial class Remark
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Remark()
        {
            this.Packages = new HashSet<Package>();
        }

        public int RemarkId { get; set; }
        public int RemarkHeaderId { get; set; }
        public string RemarkBody { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Package> Packages { get; set; }
        public virtual RemarkHeader RemarkHeader { get; set; }
    }

AutoMapper_Mapping.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using AutoMapper;
using PlannerDataLib;
using PlannerDataLib.DataModel;
using PlannerDataLib.ViewModel;

namespace PlannerWebAPI
{
    public class AutoMapper_Mapping
    {
        public static void Register_AutoMapper()
        {
            Mapper.CreateMap<Customer, CustomerViewModel>();
            Mapper.CreateMap<Order, OrderViewModel>();
            Mapper.CreateMap<Package, PackageViewModel>();
            Mapper.CreateMap<Planner, PlannerViewModel>();
            Mapper.CreateMap<Platform, PlatformViewModel>();
            Mapper.CreateMap<EndCustomer, EndCustomerViewModel>();
            Mapper.CreateMap<OrderType, OrderTypeViewModel>();
            Mapper.CreateMap<Incoterm, IncotermViewModel>();
            Mapper.CreateMap<ShippingOrganization, ShippingOrganizationViewModel>();
            Mapper.CreateMap<ShippingAddress, ShippingAddressViewModel>();
            Mapper.CreateMap<Country, CountryViewModel>();
            Mapper.CreateMap<OperatingUnit, OperatingUnitViewModel>();
            Mapper.CreateMap<PurchaseOrder, PurchaseOrderViewModel>();
            Mapper.CreateMap<OrderSource, OrderSourceViewModel>();
            Mapper.CreateMap<SalesPerson, SalesPersonViewModel>();
            Mapper.CreateMap<ApprovalStatu, ApprovalStatusVieModel>();
            Mapper.CreateMap<OrderPriority, OrderPriorityViewModel>();
            Mapper.CreateMap<Item, ItemViewModel>();
            Mapper.CreateMap<Remark, RemarkViewModel>();
            Mapper.CreateMap<RemarkHeader, RemarkHeaderViewModel>();


            Mapper.CreateMap<List<RemarkHeader>, List<RemarkHeaderViewModel>>();  
            Mapper.CreateMap<List<Package>, List<PackageViewModel>>();


            Mapper.CreateMap<PurchaseOrder, PurchaseOrderViewModel>()
              .ForMember(po => po.OrderSourceViewModel, m => m.MapFrom(md => md.OrderSource));

            Mapper.CreateMap<Order, OrderViewModel>()
                .ForMember(ov => ov.PackagesViewModel, m => m.MapFrom(md => md.Packages))
                .ForMember(ov => ov.EndCustomerViewModel, m => m.MapFrom(md => md.EndCustomer))
                .ForMember(ov => ov.OrderTypeViewModel, m => m.MapFrom(md => md.OrderType))
                .ForMember(ov => ov.IncotermViewModel, m => m.MapFrom(md => md.Incoterm))
                .ForMember(ov => ov.ShippingOrganizationViewModel, m => m.MapFrom(md => md.ShippingOrganization))
                .ForMember(ov => ov.ShippingAddressViewModel, m => m.MapFrom(md => md.ShippingAddress))
                .ForMember(ov => ov.OperatingUnitViewModel, m => m.MapFrom(md => md.OperatingUnit))
                .ForMember(ov => ov.PurchaseOrderViewModel, m => m.MapFrom(md => md.PurchaseOrder))
                .ForMember(ov => ov.SalesPersonViewModel, m => m.MapFrom(md => md.SalesPerson))
                .ForMember(ov => ov.SODViewModel, m => m.MapFrom(md => md.SalesPerson1))
                .ForMember(ov => ov.ApprovalStatusVieModel, m => m.MapFrom(md => md.ApprovalStatu))
                .ForMember(ov => ov.OrderPriorityViewModel, m => m.MapFrom(md => md.OrderPriority));

            Mapper.CreateMap<Package, PackageViewModel>()
                .ForMember(pv => pv.PlannerViewModel, m => m.MapFrom(md => md.Planner))
                .ForMember(pv => pv.PlatformViewModel, m => m.MapFrom(md => md.Platform))
                .ForMember(pv => pv.RemarkViewModel, m => m.MapFrom(md => md.Remark))
                .ForMember(pv => pv.PackageItemsViewModel, m => m.MapFrom(md => md.PackageItems));

            Mapper.CreateMap<EndCustomer, EndCustomerViewModel>()
                .ForMember(ev => ev.CustomerViewModel, m => m.MapFrom(md => md.Customer));

            Mapper.CreateMap<PackageItem, PackageItemViewModel>()
                .ForMember(piv => piv.ItemViewModel, m => m.MapFrom(md => md.Item));

            Mapper.CreateMap<ShippingAddress, ShippingAddressViewModel>()
               .ForMember(sav => sav.CountryViewModel, m => m.MapFrom(md => md.Country));

            Mapper.CreateMap<Remark, RemarkViewModel>()
               .ForMember(rs => rs.RemarkHeaderViewModel, m => m.MapFrom(md => md.RemarkHeader));
        }
    }
}

person vikrantx    schedule 07.02.2016    source источник


Ответы (1)


Вы должны создавать свои сопоставления один и только один раз, в идеале, когда ваша программа инициализируется, иначе вы можете воссоздать сопоставление, пока AutoMapper находится в процессе создания сопоставления, что действительно может привести к странному поведению. Для проекта веб-API вы, вероятно, сделаете это в методе Configuration класса Startup.

person stuartd    schedule 07.02.2016
comment
Привет, я переместил все сопоставления в методе Register_AutoMapper(), вставил Automapper_Mapping.cs и выполнил Register_AutoMapper() из функции Application_Start() global.asax. Все еще сталкиваюсь с проблемой с этим первичным отображением. Я обновил вопрос, пожалуйста, посмотрите. - person vikrantx; 10.02.2016