Search code examples
c#wcfautomapperwcf-data-servicesobjectmapper

C# AutoMapper error while mapping between data object


I have business entity object that I need to map to data contract object for WCF service using AutoMapper but I am getting error at 'MemberDataList' I have same version of Data Entity class 'Member' from data access layer which I have used to map to business object class and its working fine, not sure why this one got problem

Source Class

 public class Member 
{
    public int MemberID { get; set; }

    public string Title { get; set; }

    public string Surname { get; set; }

    public string Forename { get; set; }

    public string MiddleName { get; set; }

    public string PrevSurname { get; set; }

    public System.DateTime DOB { get; set; }

    public string Sex { get; set; }

    public Address Address { get; set; }

    public ContactDetail ContactDetail { get; set; }

    public Membership Membership { get; set; }

}

Destination Class

[DataContract]
public class MemberData : IIdentifiableEntity
{
    [DataMember]
    public int MemberID { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Surname { get; set; }

    [DataMember]
    public string Forename { get; set; }

    [DataMember]
    public string MiddleName { get; set; }

    [DataMember]
    public string PrevSurname { get; set; }

    [DataMember]
    public System.DateTime DOB { get; set; }

    [DataMember]
    public string Sex { get; set; }

    [DataMember]
    public AddressData Address { get; set; }

    [DataMember]
    public ContactDetailData ContactDetail { get; set; }

    [DataMember]
    public MembershipData Membership { get; set; }

    int IIdentifiableEntity.EntityId
    {
      get { return MemberID; }
      set { MemberID = value; }
    }
}

Mapping Class

public IList<MemberData> GetAllMember()
    {
        IList<MemberData> MemberDataList = null;

        IList<Member> memberList = _MembershipCoreServices.GetAllMember();

        if (memberList != null)
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Member, MemberData>();
            });

            IMapper mapper = config.CreateMapper();

            MemberDataList = mapper.Map<IList<MemberData>>(memberList).ToList();
        }

        return MemberDataList;
    }

Error

AutoMapper.AutoMapperMappingException was unhandled
HResult=-2146233088
Message=Missing type map configuration or unsupported mapping.

Mapping types:
Address -> AddressData
App.Core.Entities.Address -> App.Services.Contracts.AddressData

Destination path:
IList`1[0].Address0[0].Address0[0]

Source value:
(null)
Source=AutoMapper
StackTrace:
   at App.Services.Managers.MembershipManager.GetAllMember() in C:\My Work\Credit Union Application\CreditSolutionApp\App.Services.Managers\Membership\MembershipManager.cs:line 35
   at TestingApp.Program.Main(String[] args) in C:\My Work\Credit Union Application\CreditSolutionApp\TestingApp\Program.cs:line 19
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

InnerException:


Solution

  • I have figure out, as ignore all the null values from source

    here is the code

     public IList<MemberData> GetAllMember()
        {
            IList<MemberData> MemberDataList = null;
    
            IList<Member> memberList = _MembershipCoreServices.GetAllMember();
    
             if (memberList != null)
             {
                 var config = new MapperConfiguration(cfg =>
                 {
                     cfg.CreateMap<Member, MemberData>()
                              .ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
                 });
    
                 IMapper mapper = config.CreateMapper();
    
                 MemberDataList = mapper.Map<IList<MemberData>>(memberList).ToList();
    
             }
    
    
           return MemberDataList;
    
        }