Итак, я создаю базовый веб-сайт с MVC 5, в котором есть детали работы для строительной площадки. В модели Job есть три столбца, которые все связаны с моделью, называемой Employee. Таким образом,
ProjectManagerID
СуперИД
EstimatorID
вся ссылка на модель Employee (EmployeeID).
Хорошо. До сих пор я мог использовать InverseProperty и ForeignKey, чтобы иметь возможность включать EmployeeName, которое соответствует каждому из полей в модели Job.
С чем я борюсь, так это как подойти к сценарию, где есть API, который извлекает данные задания, сопоставляет его с заданием Dto - и затем задание Dto может получить соответствующие запросы поиска домена.
У меня уже есть API, работающий и извлекающий не связанные с доменом данные. Он также извлекает данные из связанных объектов, в которых есть только одно соединение с этой таблицей. Чтобы достичь этого, я создал dtos для работы, сотрудника и всех поисков, например, Рабочий статус. Automapper используется для отображения dtos.
То, что я не могу понять - и я провел много исследований - это то, как использовать dtos и automapper, чтобы отобразить модель A в модель B три раза.
Как уже упоминалось, есть Dtos для работы и работника. Итак, я попробовал создать еще одно dto для PMEmployee, которое называется PMEmployeeDto и ссылается на него из JobDto. Затем я создаю отображение в MappingProfile.cs - отображение JobDto на PMEmployeeDto.
Тестируя вызов API с Почтальоном, я получаю следующую ошибку:
"exceptionMessage": "Отсутствует конфигурация карты типов или не поддерживается
отображение. \ г \ п \ г \ nMapping
Типы: \ г \ nEmployee_138B77EF10368E30038E0A477A4BD4DFFFA659B2AD8A386CE364C5A44C213B5B
-> PMEmployeeDto \ r \ nSystem.Data.Entity.DynamicProxies.Employee_138B77EF10368E30038E0A477A4BD4DFFFA659B2AD8A386CE364C5A44C213B5B
-> MDMWebApp.Dtos.PMEmployeeDto \ r \ n \ r \ nПуть назначения: \ r \ nJobDto.PMEmployee.PMEmployee \ r \ n \ r \ nSource
Значение: \ г \ nSystem.Data.Entity.DynamicProxies.Employee_138B77EF10368E30038E0A477A4BD4DFFFA659B2AD8A386CE364C5A44C213B5B»,
"exceptionType": "AutoMapper.AutoMapperMappingException",
"stackTrace": "в System.Linq.Enumerable.WhereSelectListIterator 2.MoveNext()\r\n at
System.Linq.Enumerable.WhereEnumerableIterator
1.MoveNext () \ r \ n в
Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList (JsonWriter
писатель, IEnumerable значения, JsonArrayContract контракт, JsonProperty
член, JsonContainerContract collectionContract, JsonProperty
containerProperty) \ r \ n в
Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (JsonWriter
писатель, значение объекта, JsonContract valueContract, член JsonProperty,
Контейнер JsonContainerContractContract, JsonProperty
containerProperty) \ r \ n в
Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize (JsonWriter
jsonWriter, значение объекта, тип objectType) \ r \ n в
Newtonsoft.Json.JsonSerializer.SerializeInternal (JsonWriter
jsonWriter, значение объекта, тип objectType) \ r \ n в
System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream (Тип
тип, значение объекта, поток writeStream, кодировка
эффективное кодирование) \ r \ n в
System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream (Тип
тип, значение объекта, поток writeStream, кодировка
эффективное кодирование) \ r \ n в
System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream (Тип
тип, значение объекта, поток writeStream, содержимое HttpContent) \ r \ n в
System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync (Тип
тип, значение объекта, поток writeStream, содержимое HttpContent,
TransportContext transportContext, CancellationToken
cancellationToken) \ r \ n --- Конец трассировки стека из предыдущего местоположения
где было сгенерировано исключение --- \ r \ n в
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task
задача) \ r \ n в
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task
задача) \ r \ n вSystem.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext () "
Вот JobDto:
using System.ComponentModel.DataAnnotations;
namespace MDMWebApp.Dtos
{
public class JobDto
{
[Required]
public int JobID { get; set; }
[Required]
public string JobNumber { get; set; }
[StringLength(255)]
public string JobDescription { get; set; }
public JobStatusDto JobStatus { get; set; }
public JobTypeDto JobType { get; set; }
public InsuranceTypeDto InsuranceType { get; set; }
public ClientDto Client { get; set; }
public PMEmployeeDto PMEmployee { get; set; }
}
}
PMEmployeeDto:
namespace MDMWebApp.Dtos
{
public class PMEmployeeDto
{
public int EmployeeID { get; set; }
public string EmployeeFullName { get; set; }
}
}
И MappingProfile:
using AutoMapper;
using MDMWebApp.Dtos;
using MDMWebApp.Models;
namespace MDMWebApp.App_Start
{
public class MappingProfile : Profile
{
public MappingProfile()
{
Mapper.CreateMap<Employee, EmployeeDto>();
Mapper.CreateMap<EmployeeDto, Employee>();
Mapper.CreateMap<InsuranceType, InsuranceTypeDto>();
Mapper.CreateMap<Job, JobDto>();
Mapper.CreateMap<JobType, JobTypeDto>();
Mapper.CreateMap<JobStatus, JobStatusDto>();
Mapper.CreateMap<JobTitle, JobTitleDto>();
Mapper.CreateMap<JCSummary, JCSummaryDto>();
Mapper.CreateMap<Client, ClientDto>();
Mapper.CreateMap<JobDto, PMEmployeeDto>();
}
}
}
Буду признателен за любую помощь.