Мои объекты класса исчезают при выполнении следующего запроса к моему API (InMemoryDb) - PullRequest
0 голосов
/ 19 июня 2019

Я следовал этому учебнику при создании API и столкнулся с проблемой, которую я изо всех сил пытаюсь решить:

У меня есть два модельных класса: Todo и TodoItem.

Я поместил ICollection TodoItems в класс Todo.

Когда я должен вернуть Todo из запроса API GET, он работает в первый раз, но как только второй запрос отправляется, коллекция TodoItem перезаписывается и снова объявляется через конструктор Todo.

  • Попробовал несколько аннотаций (ForeignKey).
  • Добавление списка TodoItemIds внутри Todo (Тип TodoItemIds = новый класс с идентификатором и TodoItemId).
  • Хранение Todo и TodoId внутри TodoItem.
  • Попытка добавить некоторый код в OnModelcreating () в TodoContext (modelBuilder.Entity <> () ...).

Вот код контроллера, я не знаю, как его аккуратно вставить ...:

TodoController

public TodoController(TodoContext context){
    _context = context;

    if (_context.TodoItems.Count() == 0)
    {
        // Create a new TodoItem if collection is empty,
        // which means you can't delete all TodoItems.
        _context.Todos.Add(new Todo(new TodoItem("Walk the dog")));
        _context.SaveChanges();
    }
}

// GET: api/Todo
[HttpGet]
public async Task<ActionResult<List<Todo>>> GetTodo()
{
    return await _context.Todos.ToListAsync();
}

TodoContext

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Todo>()
        .HasMany(t => t.TodoItems);

    base.OnModelCreating(modelBuilder);
}

Первый запрос-ответ-ответ

[
    {
        "id": "34bfd453-8f06-4733-a4b6-1fb209327a8d",
        "todoItems": [
            {
                "id": 1,
                "name": "Walk the dog",
                "isComplete": false,
                "todoId": "34bfd453-8f06-4733-a4b6-1fb209327a8d"
            }
        ]
    }
]

Второй ответ Get-Request-Response

 [
     {
        "id": "34bfd453-8f06-4733-a4b6-1fb209327a8d",
        "todoItems": []
     }
 ]

Список задач не должен исчезать.

1 Ответ

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

Вам необходимо загрузить Todo.TodoItems из базы данных.

[HttpGet]
public async Task<ActionResult<List<Todo>>> GetTodo()
{
    return await _context.Todos.Include(t => t.TodoItems).ToListAsync();
}

Приведенный выше код использует Eager Loading, Include(t => t.TodoItems), но существуют различные способы загрузки связанных данных с использованием EFCore.

Причина, по которой TodoItem появляется в первый раз, заключается в том, что он был просто добавлен в TodoContext, поэтому он все еще загружен в этот конкретный экземпляр TodoContext.

...