I have the following classes:
public class Employee : FullAuditedEntity<Guid>
{
<<<<properties....>>>
public ICollection<Contact> Contacts {get;set;}
}
public class Contact : FullAuditedEntity<Guid>
{
<<<properties...>>>
public ICollection<Address> Addresses {get;set;}
}
public class Address : FullAuditedEntity<Guid>
{
<<<properties...>>>
}
Which means an employee can have multiple contacts and each contact can have multiple addresses.
Now I have the following Dtos to insert 1 employee record.
public class EmployeeDto : FullAuditedEntityDto<Guid>
{
<<<<properties....>>>
public ICollection<ContactDto> Contacts {get;set;}
}
public class ContactDto : FullAuditedEntityDto<Guid>
{
<<<properties...>>>
public ICollection<AddressDto> Addresses {get;set;}
}
public class AddressDto : FullAuditedEntityDto<Guid>
{
<<<properties...>>>
}
I have the following automapper configuration for layer 1 mapping, where we map employee to employeeDto and contact to contactdto.
CreateMap<Employee, EmployeeDto>()
.ForMember(dest => dest.Contacts,
opt => opt.MapFrom(src => src.Contacts));
How can we map the address in contact to the addressdto in contactdto?
Or is there a more reliable method. Thank you
7 Answer(s)
-
0
hi
I think you can create three maps.
CreateMap<Employee, EmployeeDto>() CreateMap<Contact, ContactDto>() CreateMap<AddressDto, AddressDto>()
https://docs.automapper.org/en/latest/Getting-started.html
-
0
there are 3 maps apart from this. but i am getting error saying there is mapping issue inside employee with the contact entity.
-
0
Please share the error details.
-
0
2021-09-15 10:34:23.663 +04:00 [ERR] ---------- RemoteServiceErrorInfo ---------- { "code": null, "message": "An internal error occurred during your request!", "details": null, "data": {}, "validationErrors": null }
2021-09-15 10:34:23.665 +04:00 [ERR] Error mapping types. Mapping types: Employee -> EmployeeDto ZW.EmployeeMgmtSvc.Employees.Employee -> ZW.EmployeeMgmtSvc.Employees.EmployeeDto Type Map configuration: Employee -> EmployeeDto ZW.EmployeeMgmtSvc.Employees.Employee -> ZW.EmployeeMgmtSvc.Employees.EmployeeDto Destination Member: Contacts AutoMapper.AutoMapperMappingException: Error mapping types. Mapping types: Employee -> EmployeeDto ZW.EmployeeMgmtSvc.Employees.Employee -> ZW.EmployeeMgmtSvc.Employees.EmployeeDto Type Map configuration: Employee -> EmployeeDto ZW.EmployeeMgmtSvc.Employees.Employee -> ZW.EmployeeMgmtSvc.Employees.EmployeeDto Destination Member: Contacts ---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping. Mapping types: Contact -> ContactDto ZW.EmployeeMgmtSvc.Contacts.Contact -> ZW.EmployeeMgmtSvc.Contacts.ContactDto at lambda_method3391(Closure , Contact , ContactDto , ResolutionContext ) at lambda_method3390(Closure , Object , EmployeeDto , ResolutionContext ) --- End of inner exception stack trace --- at lambda_method3390(Closure , Object , EmployeeDto , ResolutionContext ) at Volo.Abp.ObjectMapping.DefaultObjectMapper.Map[TSource,TDestination](TSource source) at ZW.EmployeeMgmtSvc.Employees.EmployeeAppService.CreateAsync(EmployeeCreateAndUpdateDto input) in D:\Workspace\EmployeeMgmtSvc\aspnet-core\src\ZW.EmployeeMgmtSvc.Application\Employees\EmployeeAppService.cs:line 90 at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync() at Volo.Abp.GlobalFeatures.GlobalFeatureInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync() at Volo.Abp.Auditing.AuditingInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync() at Volo.Abp.Validation.ValidationInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync() at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed) at lambda_method2489(Closure , Object ) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) 2021-09-15 10:34:23.677 +04:00 [INF] Executing ObjectResult, writing value of type 'Volo.Abp.Http.RemoteServiceErrorResponse'. 2021-09-15 10:34:23.690 +04:00 [INF] Executed action ZW.EmployeeMgmtSvc.Employees.EmployeeAppService.CreateAsync (ZW.EmployeeMgmtSvc.Application) in 7668.1201ms 2021-09-15 10:34:23.690 +04:00 [INF] Executed endpoint 'ZW.EmployeeMgmtSvc.Employees.EmployeeAppService.CreateAsync (ZW.EmployeeMgmtSvc.Application)' 2021-09-15 10:34:24.889 +04:00 [DBG] Added 0 entity changes to the current audit log 2021-09-15 10:34:24.889 +04:00 [DBG] Added 0 entity changes to the current audit log
-
0
hi
Can you share a simple project?
-
0
Hi @maliming,
The code I am using has code pertaining to our active project development. If possible could you please remote desktop and see the code?
-
0
https://zoom.us/j/97169875896?pwd=b2ZFRjc3VFZUTkZpeFE2TlN4NjZwdz09