【问题标题】:When is DbContext.Entry(enttity).State = EntityState.Modified; required?什么时候 DbContext.Entry(entity).State = EntityState.Modified;必需的?
【发布时间】:2021-02-10 02:38:52
【问题描述】:

我想澄清一下何时需要使用 Entity Framework Core 设置 EntityState

上下文:代码优先的 C# Blazor Server 应用程序、SQL Server 数据库。

考虑:

    public async Task UpdateHelper(Helper helperx)
    {
        _context.Helpers.Update(helperx);
        _context.Entry(helperx).State = EntityState.Modified;
        await _context.SaveChangesAsync();
    }

什么时候上线:

    _context.Entry(helperx).State = EntityState.Modified;  

需要还是不需要?

【问题讨论】:

标签: c# sql-server-2005 entity-framework-core blazor


【解决方案1】:

简单的答案:不需要与Update 结合使用。

我强烈建议避免接受来自浏览器的实体的代码。

  1. 安全性——进来的“实体”是一个反序列化的 JSON 数据块。您的 UI 可能允许用户修改一些预期数据,但可以设置调试工具和插件来修改传递给您的服务器调用的所有字段。与该实体执行Update 的代码将隐式信任此数据并覆盖您现有的数据状态。

  2. 性能 - 使用 Update 可以有效地更新实体上的 所有 列,无论它们是否已更改。它还要求您始终在服务器和客户端之间传递一个完整的对象图,以确保在尝试保存实体时数据不会被空白。

  3. 过时覆盖 - 从客户端传回的数据仅与读取时一样最新。自那时以来对数据所做的任何更改都将被静默覆盖。检查 RowVersion / Timestamp 之类的内容意味着在更新之前从数据库中读取数据。在确定写入是否安全之前,您应该重新读取数据。

相反,利用 POCO 视图模型在客户端和服务器之间传输数据。这将数据有效负载减少到仅需要的内容,并避免了序列化实体图的性能缺陷。它还减少了提供给客户端的信息,攻击者可以检查这些信息以构建您的数据模式的图片,并确保只有您希望更改的值才会被更改。 ViewModel 还可以包含 RowVersion,以便在重新加载实体时进行比较,以检测和处理潜在的更改冲突。

【讨论】:

  • Q 被标记为 blazor-server:没有 json、没有反序列化、没有从客户端传回的数据、没有负载、没有序列化、没有数据架构。
  • 这条评论正确,简洁。不过,发布的答案非常有用。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2021-05-23
  • 2019-12-09
  • 1970-01-01
  • 2015-10-11
  • 2013-02-09
相关资源
最近更新 更多