Ef избегает привязки свойств навигации к dto

В моей модели данных EF у меня есть сущность Location и сущность LocationType. Местоположение имеет свойство FkLocationTypeID. Теперь, если я возвращаю объект Location из конечной точки API, он возвращает большой объект, к которому привязаны все свойства навигации. Поэтому я создал LocationDto, чтобы возвращать только те свойства, которые мне нужны. Мой DTO выглядит примерно так:

 public class LocationDto
{
    public int LocationId { get; set; }
    public LocationDto ParentLocation { get; set; }
    public LocationType LocationType { get; set; }
    public string LocationName { get; set; }
    public string LocationCode { get; set; }
    // other properties here
}

Теперь проблема в том, что у меня есть свойство LocationType в моем DTO, которое является объектом EF. В тот момент, когда я добавляю его, мой JSON снова становится очень длинным из-за всех ассоциаций с LocationType.

Есть ли способ избежать этого и получить только объект LocationType?

Ниже показано, как выглядит мой json после включения LocationType.

    {
  "locationId": 0,
  "locationType": {
    "locationTypeId": 0,
    "locationTypeName": "string",
    "locationTypeDisplayName": "string",
    "localizedKey": "string",
    "locations": [
      {
        "locationId": 0,
        "fkParentLocationId": 0,
        "fkLocationTypeId": 0,
        "fkTimeZoneId": 0,
        "locationName": "string",
        "locationDisplayName": "string",
        "locationCode": "string",
        "address1": "string",
        "address2": "string",
        "city": "string",
        "state": "string",
        "country": "string",
        "zipCode": "string",
        "phoneNumber": "string",
        "faxNumber": "string",
        "phoneExtention": "string",
        "email": "string",
        "longitude": 0,
        "latitude": 0,
        "useAppointments": true,
        "availabilityWindowDays": 0,
        "appointmentCutOffDays": 0,
        "dailySummaryEmailTime": "string",
        "durationBeforeFirstApptHours": 0,
        "reminderBeforeApptSmsHours": 0,
        "reminderBeforeApptEmailHours": 0,
        "createdBy": 0,
        "createdDate": "2018-10-26T06:51:00.288Z",
        "changedBy": 0,
        "changedDate": "2018-10-26T06:51:00.288Z",
        "activeStatus": 0,
        "enableStaffSelection": true,
        "showInWidget": true,
        "autoAssign_FloatPriorityMode": 0,
        "googleReserveEnabled": true,
        "messageLogs": [
          {
            "messageLogId": 0,
            "fkMessageFormatTypeId": 0,
            "fkMessageTypeId": 0,
            "fkLocationId": 0,
            "fkUserId": 0,
            "fkAppointmentId": 0,
            "sentTime": "2018-10-26T06:51:00.288Z",
            "messageUid": "string",
            "messageFormatType": {
              "messageFormatTypeId": 0,
              "messageFormatTypeName": "string",
              "messageTemplates": [
                {
                  "messageTemplateId": 0,
                  "fkMessageFormatTypeId": 0,
            .....................................
          }
       }

Лучше не иметь сущности EF внутри DTO stackoverflow.com/questions/34801414/…

Shcherban 26.10.2018 08:59

Правильно, я также могу создать DTO для LocationType. Я хотел посмотреть, есть ли альтернатива, в которой я мог бы просто избежать всех циклических ссылок, не делая этого.

devC 26.10.2018 09:01

также вы можете отключить создание прокси stackoverflow.com/a/32012202/1644522

Shcherban 26.10.2018 09:03
2
3
301
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • не смешивайте модели EF и DTO!
  • создать полный набор DTO в отдельном пространстве имен (проект, сборка)
  • используйте сопоставитель (например, Automap или аналогичный) для сопоставления между моделями EF и DTO

Да, я думаю, это лучшее, что можно сделать.

devC 26.10.2018 12:40

Другие вопросы по теме