代码之家  ›  专栏  ›  技术社区  ›  David Jones

何时是DbContext。入口(入口)。状态=实体状态。被改进的;必修的?

  •  0
  • David Jones  · 技术社区  · 5 年前

    我想澄清我何时需要设置 EntityState

    上下文:代码优先的C#Blazor服务器应用程序,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;  
    

    0 回复  |  直到 5 年前
        1
  •  2
  •   Steve Py    5 年前

    答案很简单:不需要与 Update .

    避免 从浏览器接受实体的代码。

    1. 安全性-进入的“实体”是JSON数据的反序列化块。用户界面可能允许用户修改某些预期数据,但调试工具和加载项可以设置为修改 全部的 正在传递给服务器调用的字段。执行 该实体将隐式信任此数据并覆盖现有数据状态。

    2. 性能使用 使现代化 正在有效地更新

    3. 过时覆盖-从客户端传回的数据仅与读取时的数据相同。自那时起对数据所做的任何更改都将被默默地覆盖。检查RowVersion/Timestamp等内容意味着在更新之前从DB读取数据。你 应该 在确定写入是否安全之前重新读取数据。

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