【问题标题】:Update of Table when I don't have the key value当我没有键值时更新表
【发布时间】:2021-10-06 13:07:09
【问题描述】:

我正在使用实体框架开发一个 .net 核心 API。我已经做了一段时间的开发,但对实体框架还是陌生的。此外,我正在尝试使用 DTO 对象来限制和减少可用信息量。我的问题是这个。如果我没有将我的唯一 ID 从数据库传递回最终用户,我该如何针对该对象执行更新?

例如我有一个类

ID、名字、姓氏、年龄

我返回给最终用户的 DTO 是:

名字、姓氏、年龄

如何在没有 ID 的情况下实现更新和删除?

我知道这可能是一个愚蠢的问题,我错过了显而易见的问题,所以请保持温和。我一直在寻找答案,但每次搜索时,我都会不断寻找有关没有主键的表的问题。

【问题讨论】:

    标签: c# entity-framework-core dto


    【解决方案1】:

    如果不使用 Id 或其他主键,您将无法更新记录。例如,要更新用户,您需要查找已存在的用户记录,更新部分或全部属性并保存。不使用 Id 找到用户的唯一方法是

    var existedUser = Context.Set<User>().Where(u=> u.FirstName==dto.FirstName 
    && u.LastName==dto.LastName  
    && u.Age==dto.Age).FirstOrDefault();
    

    但由于您必须更新用户属性,这意味着 FirstName 或 LastName 或 Age 或所有这些都已在您的 Dto 中更改,因此您无法使用它们来查找要更新的用户记录。

    您可以使用此代码查找要删除的用户,但这也不是最好的主意,因为可以是具有相同姓名和年龄的不同用户。

    【讨论】:

    • 这是有道理的。那么为什么所有专家都在谈论泄漏密钥呢?如果他们不将密钥作为其 DTO 对象的一部分返回,他们将如何执行更新?很抱歉有这么多后续行动,我只是想把这件事做好。顺便感谢谢尔盖的帮助。
    • 但是在 Dto 中包含 Id 有什么问题?您从 db 获取所有属性,为什么不包含 Id?
    • 据我了解,将系统信息发送回最终用户是一种不好的做法。它浪费带宽并损害您的系统。我从某人那里得到的一个例子是,如果您发送 Key 并且它是一个 int 值,那么黑客可以确定您表中的记录数。我不相信这是真的,因为根据我的经验,int 键值总是被跳过。但无论如何,我只是想建立更健全的东西,并且对目前的方式感到困惑。
    • @pachyderm94 甚至安全令牌也以这种方式发送。每个人都使用 ID。我从未见过没有使用它的项目。你是第一。保持信息私密性的唯一方法是使用 https 协议。没有其他工作。
    • @pachyderm94 你是如何得到名字,姓氏等等的?我只能猜测你发送了一个带有 ID 的 GET 请求,为什么你现在不使用它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2016-07-21
    • 1970-01-01
    • 2014-10-19
    • 2020-11-25
    相关资源
    最近更新 更多