Entity Framework 核心在 Blazor 中自动保存对象
Entity Framework Core autosaves objects in Blazor
我可能不明白某些东西在 Blazor 中是如何工作的,但这就是我的问题:
每当我想编辑一个对象,例如 People
对象时,我从 table select 它在 @page "/people"
中,然后我被重定向到 @page "people/edit/id"
。在 @page "people/edit"
我有一个 EditForm
和 InputText
对应于人物模型和 @bind
值,一切正常,它正确加载数据。
问题是当我编辑了一些输入但没有保存数据,只是修改了它的值,然后返回到@page "people"
,或者任何地方,对象都被修改了。
我什至下了一个断点来观察通过Entity Framework核心从数据库中拉取对象,它也显示了修改后的版本,但是检查数据库table,似乎没有受到影响。
这听起来不可能,但我尝试过全新的项目,或者其他人在视频教程中的项目,尝试复制并做同样的事情,这有什么关系?
@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);
}
}
首先,如果您将某个对象作为 EditForm
的模型并对其进行一些更改,所有更改都会立即反映在对象中,但不会在您单击提交后反映出来。
其次,当您从数据库中提取一个对象时,它会附加到 DbContext 并保持附加状态,除非您明确地将其分离。当您查询已经附加到上下文的实体时,上下文不会再次查询数据库,而是为您提供附加的实体。如果您对其进行了一些更改,您将获得这些更改。
但是这些更改在您执行 context.SaveChanges
之前不会保存到数据库中,因此当您看到实际的数据库时,您会看到未更改的数据。
与Net Core MVC的区别在于Net Core MVC是无状态的。尽管您在 .cshtml
文件中使用对 .NET 对象的引用,但它们仅在一次查询期间使用,并在将响应发送到客户端后被销毁。使用 Blazor 时,您会在服务器(Blazor 服务器)或客户端(Blazor wasm)上获得实际的 .NET 运行时以太币,因此您的对象会保留并保留其状态。
我可能不明白某些东西在 Blazor 中是如何工作的,但这就是我的问题:
每当我想编辑一个对象,例如 People
对象时,我从 table select 它在 @page "/people"
中,然后我被重定向到 @page "people/edit/id"
。在 @page "people/edit"
我有一个 EditForm
和 InputText
对应于人物模型和 @bind
值,一切正常,它正确加载数据。
问题是当我编辑了一些输入但没有保存数据,只是修改了它的值,然后返回到@page "people"
,或者任何地方,对象都被修改了。
我什至下了一个断点来观察通过Entity Framework核心从数据库中拉取对象,它也显示了修改后的版本,但是检查数据库table,似乎没有受到影响。
这听起来不可能,但我尝试过全新的项目,或者其他人在视频教程中的项目,尝试复制并做同样的事情,这有什么关系?
@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);
}
}
首先,如果您将某个对象作为 EditForm
的模型并对其进行一些更改,所有更改都会立即反映在对象中,但不会在您单击提交后反映出来。
其次,当您从数据库中提取一个对象时,它会附加到 DbContext 并保持附加状态,除非您明确地将其分离。当您查询已经附加到上下文的实体时,上下文不会再次查询数据库,而是为您提供附加的实体。如果您对其进行了一些更改,您将获得这些更改。
但是这些更改在您执行 context.SaveChanges
之前不会保存到数据库中,因此当您看到实际的数据库时,您会看到未更改的数据。
与Net Core MVC的区别在于Net Core MVC是无状态的。尽管您在 .cshtml
文件中使用对 .NET 对象的引用,但它们仅在一次查询期间使用,并在将响应发送到客户端后被销毁。使用 Blazor 时,您会在服务器(Blazor 服务器)或客户端(Blazor wasm)上获得实际的 .NET 运行时以太币,因此您的对象会保留并保留其状态。