Я работаю над созданием ASP.NET Core Web API и столкнулся с проблемой при запросе контекста.
Web API подключается к базе данных с 3 таблицами: сотрудники, события и обязанности по событиям. Сотрудник может создать много событий. Кроме того, многим сотрудникам могут быть назначены обязанности по многим событиям в каждом из этих событий (отсюда и ссылка на таблицу ответственности по событиям).
Таблица сотрудников
+----+-----------------+
| Id | Name |
+----+-----------------+
| 1 | First Employee |
| 2 | Second Employee |
+----+-----------------+
Таблица событий
+----+------------+---------------+
| Id | Creator_Id | Event_Name |
+----+------------+---------------+
| 1 | 1 | Random Event |
| 2 | 1 | Another Event |
+----+------------+---------------+
Таблица ответственности за события
+----+-------------+----------+
| Id | Employee_Id | Event_Id |
+----+-------------+----------+
| 1 | 1 | 1 |
+----+-------------+----------+
Модели этих моделей включают ...
Модель события
На мероприятии может быть только сотрудник в качестве создателя.
В мероприятии также может участвовать много сотрудников с разными обязанностями.
public int Id { get; set; }
public int? CreatorId { get; set; }
public string EventName { get; set; }
public Employee Creator { get; set; }
public ICollection<EventResponsibilities> EventResponsibilities { get; set; }
Модель сотрудника
Сотрудник может быть создателем многих событий.
Сотрудник может иметь обязанности во многих случаях.
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Event> Event { get; set; }
public ICollection<EventResponsibilities> EventResponsibilities { get; set; }
Модель Event_Responsabilities
Модель таблицы связи «многие ко многим».
public int Id { get; set; }
public int? EmployeeId { get; set; }
public int? EventId { get; set; }
public Employee Employee { get; set; }
public Event Event { get; set; }
Я выполнил следующий запрос LINQ в методе контроллера ...
return _context.Event.Include(e => e.EventResponsibilities).ThenInclude(e => e.Employee);
Я ожидаю, что получит JSON, в котором есть подробности о событии, его ответственности за соответствующее событие и связанного с ним сотрудника для этой ответственности.
На самом деле я получаю следующий json ...
[
{
"Id": 1,
"CreatorId": 1,
"EventName": "Random Event",
"Creator": {
"Id": 1,
"Name": "First Employee",
"Event": [],
"EventResponsibilities": [
{
"Id": 1,
"EmployeeId": 1,
"EventId": 1
}
]
},
"EventResponsibilities": [
{
"Id": 1,
"EmployeeId": 1,
"EventId": 1,
"Employee": {
"Id": 1,
"Name": "First Employee",
"Event": [],
"EventResponsibilities": []
}
}
]
},
{
"Id": 2,
"CreatorId": 1,
"EventName": "Another Event",
"Creator": {
"Id": 1,
"Name": "First Employee",
"Event": [
{
"Id": 1,
"CreatorId": 1,
"EventName": "Random Event",
"EventResponsibilities": [
{
"Id": 1,
"EmployeeId": 1,
"EventId": 1
}
]
}
],
"EventResponsibilities": [
{
"Id": 1,
"EmployeeId": 1,
"EventId": 1,
"Event": {
"Id": 1,
"CreatorId": 1,
"EventName": "Random Event",
"EventResponsibilities": []
}
}
]
},
"EventResponsibilities": []
}
]
Это не то, что я хотел или ожидал ...
Как вы можете видеть, по какой-то причине свойство навигации Creator для модели Event отображается, хотя я не запросил его в запросе, поскольку я не использовал для него Include ().
Кроме того, если вы посмотрите на второе возвращенное Событие в JSON («Id»: 2), даже если нет никаких EventResponsabilities, есть две возвращаемые строки-создатели. Я не думаю, что это проблема отложенной загрузки, поскольку свойства навигации не являются виртуальными.
Я бы ожидал, что объект Creator будет нулевым или пустым, поскольку я его не включал.
Итак, мой вопрос: Почему свойство навигации Creator включено, даже если я его не загружал / не включал? Кроме того, я также хотел бы знать, как
не
включает соответствующие данные Создателя и отображает только данные об ответственности за событие в JSON.