Entity Framework Core автоматически сохраняет объекты в Blazor - PullRequest
0 голосов
/ 02 апреля 2020

Возможно, я не понимаю, как работают некоторые вещи в Blazor, но вот в чем моя проблема:

всякий раз, когда я хочу отредактировать объект, например, объект People, я выбираю его в @page "/people" из стол, затем я перенаправлен на @page "people/edit/id". В @page "people/edit" у меня есть EditForm с InputText, соответствующим модели сотрудников, и значением @bind, все нормально, данные загружаются правильно.

Проблема в том, что когда я редактирую некоторые из входы, а не сохранять данные, просто измените их значения, а затем go обратно на @page "people", или где угодно, объект будет изменен.

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

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

@page "/People/edit{id}"

@code {
    [Parameter] public string id { get; set; }
    Person person = new Person();

    protected override async Task OnParametersSetAsync()
    {
        person = await PersonService.GetByIdAsync(id);
    }
}

1 Ответ

1 голос
/ 13 апреля 2020

Во-первых, если вы поместите какой-либо объект в качестве модели для EditForm и внесете в него некоторые изменения, все изменения будут отражены в объекте немедленно, но не после нажатия кнопки «Отправить». Во-вторых, когда вы извлекаете объект из базы данных, он присоединяется к DbContext и остается подключенным, если вы не отключите его явно. Когда вы запрашиваете сущность, уже присоединенную к контексту, контекст больше не запрашивает базу данных, а выдает присоединенную сущность. И если вы внесли в него некоторые изменения, вы получите эти изменения. Но эти изменения не сохраняются в базе данных, пока вы не выполните context.SaveChanges, поэтому, когда вы видите реальную базу данных, вы видите неизмененные данные.

Разница с Net Core MVC заключается в том, что Net Ядро MVC не имеет состояния. Хотя вы используете ссылки на объекты. NET в .cshtml файлах, они используются только в течение одного запроса и уничтожаются после отправки ответа клиенту. Когда вы используете Blazor, вы получаете фактический. NET исполняемый эфир на сервере (сервер Blazor) или на клиенте (Blazor wasm), поэтому ваши объекты остаются и сохраняют свое состояние.

...