Некоторые данные из внешнего ключа загружаются автоматически, хотя я этого не включал - PullRequest
0 голосов
/ 06 июля 2019

Я делаю проект о том, чтобы 2 или более человека могли назначить встречу друг другу. все работает нормально, но я просто понимаю, что некоторые данные из внешнего ключа автоматически загружаются, хотя я не включил их в код.

Это результат API, который я сделал

{
    "uId": 1,
    "userId": "xxxx",
    "receiveAppointmentForms": [],
    "requestAppointmentForms": [
        {
            ...Some infomation,
            "receiveUser": {
                "uId": 2,
                "userId": "zzz",
                "receiveAppointmentForms": [],
                "requestAppointmentForms": null,
                "topThrees": null,
                "userRole": null,
                "coach": null,
                "department": null,
                "position": null
            },
            "record": null
        }
    ],
    "userRole": null,
    "coach": null,
    "department": null,
    "position": null
},

Итак, я включил поле «requestAppointmentForms», но я не хочу, чтобы отображался «receiveUser», то есть внешний ключ, относящийся к таблице User. потому что я не использовал эту информацию на своей веб-странице, и это замедляет запрос, потому что в нем много данных.

Вот мой код на контроллере

[HttpGet]
public IEnumerable<User> GetUsers()
{
    return _context.Users.Include( r => r.ReceiveAppointmentForms)
                          .Include(r => r.RequestAppointmentForms);
}

код от модели формы назначения

    [Key]
    public int AppointmentFormId { get; set; }
    public string AppointmentDate { get; set; }
    public DateTime AppointmentDateRequest { get; set; }
    public string AppointmentTimeStart { get; set; }
    public string AppointmentStatus { get; set; }
    public string AppointmentCancelComment { get; set; }

    public int? RequestUserId { get; set; }
    public int? ReceiveUserId { get; set; }

    public User RequestUser { get; set; }

    public User ReceiveUser { get; set; }
    public AppointmentRecord Record { get; set; }

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Это поведение по умолчанию для обращения к циклу.

Entity Framework Core автоматически исправит свойства навигации для любых других объектов, которые были ранее загружены в контекст пример. Так что, даже если вы явно не включаете данные для свойство навигации, свойство все еще может быть заполнено, если некоторые или все связанные объекты были загружены ранее.

Ссылка: Стремительная загрузка .

Для игнорирования receiveUser, вы можете попробовать

services.AddMvc()
    .AddJsonOptions(opt => {
        opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Или вы можете создать ViewModel и попытаться AutoMapper отобразить сущность в viewmodel.

0 голосов
/ 06 июля 2019

Одной вещью, которую вы можете сделать, отправляя данные через API, является создание нового класса.это безопасно, и вы можете отправлять любые данные, которые вы только хотите.(ViewModels)

если вы используете свои объекты напрямую, WebAPI будет связывать с ними все параметры, даже если вы этого не хотите.Я предлагаю создать новую модель, а затем отправить ваши данные

public class UserViewModel
{
    public int AppointmentFormId { get; set; }
    public string AppointmentDate { get; set; }
    public DateTime AppointmentDateRequest { get; set; }  
    //Your other data and tables you want
}

Теперь позвоните в ваш Api Будет вот так

[HttpGet]
public IEnumerable<UserViewModel> GetUsers()
{
IEnumerable<UserViewModel> usersList = new List<UserViewModel>();
foreach (var item in _context.Users.tolist())
{
userList.add(new UserViewModel{
AppointmentFormId  = item.AppointmentFormId ,
//other data
});
}

Это просто и безопасно!

Вы можете проверить эту ссылку для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...