【问题标题】:Entity Framework Core autosaves objects in BlazorEntity Framework Core 在 Blazor 中自动保存对象
【发布时间】:2020-07-14 21:25:50
【问题描述】:

我可能不明白某些东西在 Blazor 中是如何工作的,但这是我的问题:

每当我想编辑一个对象时,例如People 对象,我从表中的@page "/people" 中选择它,然后我被重定向到@page "people/edit/id"。在@page "people/edit" 我有一个EditFormInputText 对应于人员模型和@bind 值,一切正常,它正确加载数据。

问题是当我编辑一些输入而不保存数据,只是修改它的值,然后回到@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);
    }
}

【问题讨论】:

  • 嗯,EF 对象,即 POCO 类的实例,是引用类型,所以如果您在一处更改,那么您将在整个代码中受到影响。因此,即使您从数据库中提取新实例,也不会调用SubmitChanges 它不会受到影响。因此,您将在内存中拥有记录的“一个版本”,并且您将从 DB 中提取另一个版本。
  • 我想过,但在 Net Core MVC 项目上尝试了同样的事情,但没有发生......
  • 听起来更改跟踪正在将您的更改缓存在 DbContext 中。

标签: sql-server entity-framework-core blazor blazor-client-side


【解决方案1】:

首先,如果您将某个对象作为EditForm 的模型并对其进行一些更改,则所有更改都会立即反映在对象中,但不会在您单击提交后反映。 其次,当您从数据库中提取对象时,它会附加到 DbContext 并保持连接状态,除非您显式分离它。当您查询已附加到上下文的实体时,上下文不会再次查询数据库,而是为您提供附加的实体。如果您对其进行了一些更改,您将获得这些更改。 但是这些更改在您执行context.SaveChanges 之前不会保存到数据库中,因此当您查看实际数据库时,您会看到未更改的数据。

与 Net Core MVC 的不同之处在于 Net Core MVC 是无状态的。尽管您在 .cshtml 文件中使用对 .NET 对象的引用,但它们仅在一次查询期间使用,并在响应发送到客户端后被销毁。使用 Blazor 时,您会在服务器(Blazor 服务器)或客户端(Blazor wasm)上获得实际的 .NET 运行时以太,因此您的对象会保留并保持其状态。

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 2016-12-18
    • 2020-03-12
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多