Как управлять объектами Dto и отображением в MVC, когда таблица A присоединяется к таблице B несколько раз - PullRequest
0 голосов
/ 07 июня 2019

Итак, я создаю базовый веб-сайт с 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>();
        }
    }
}

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 11 июня 2019

ViewModels работал нормально здесь.Я предупрежу, что с приложением является внутренним и не будет выставлено в интернет, поэтому мне не пришлось идти на ручное тестирование и тому подобное.

...