【问题标题】:Why some attributes arrive null and others not using get method in ASP.NET?为什么在 ASP.NET 中有些属性为 null 而有些则不使用 get 方法?
【发布时间】:2021-11-30 15:36:24
【问题描述】:

好的,所以我有一个在 ASP.NET 中开发的 API,其中包含所有 CRUD 方法。其中一个模型如下所示:

public class Client
{
    public int Id { get; set; }
    public string First_Name { get; set; }
    public string Second_Name { get; set; }
    public string First_Last_Name { get; set; }
    public string Second_Last_Name { get; set; }
    public string Phone { get; set; }

    [DataType(DataType.Date)]
    public DateTime Birth_Date { get; set; }
    public string Password { get; set; }
    public string User { get; set; }
}

GetAllClients 方法如下所示:

public async Task<IEnumerable<Client>> GetAllClients()
{
    var db = dbConnection();
    var sql = @"
                SELECT id, first_name, second_name, first_last_name, second_last_name, phone, birth_date, _password, _user
                FROM public.""Clients"" ";
    return await db.QueryAsync<Client>(sql, new { });
}

但是当passworduser 属性在数据库中有值时,它们会到达空值。这是我得到的回复:

[
  {
    "id": 101110111,
    "first_Name": "Primer Nombre",
    "second_Name": "Segundo Nombre",
    "first_Last_Name": "Primer Apellido",
    "second_Last_Name": "Segundo Apellido",
    "phone": "11111111",
    "birth_Date": "2021-01-01T00:00:00",
    "password": null,
    "user": null
  },
  {
    "id": 202220222,
    "first_Name": "Nombre1",
    "second_Name": "SegNombre1",
    "first_Last_Name": "Apellido1",
    "second_Last_Name": "SegApellido1",
    "phone": "22222222",
    "birth_Date": "2000-01-01T00:00:00",
    "password": null,
    "user": null
  }
]

我知道在数据库中明确显示密码是一种不好的做法,但现在我正在使用给定密码和用户的身份验证,但如果它们在响应中为空,我就不能这样做。 我以为这是属性的名称,但不是。 顺便说一句,如果有帮助,我必须使用 postgreSQL。

这是表定义:

CREATE TABLE IF NOT EXISTS public."Clients"
(
    id integer NOT NULL,
    first_name text COLLATE pg_catalog."default" NOT NULL,
    second_name text COLLATE pg_catalog."default",
    first_last_name text COLLATE pg_catalog."default" NOT NULL,
    second_last_name text COLLATE pg_catalog."default",
    phone text COLLATE pg_catalog."default" NOT NULL,
    birth_date date NOT NULL,
    _password text COLLATE pg_catalog."default" NOT NULL,
    _user text COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT "Clients_pkey" PRIMARY KEY (id)
);

谢谢!

【问题讨论】:

  • 检查db.QueryAsync&lt;Client&gt; 的输出。如果你在那里看到密码,这意味着你有某种特殊的序列化器知道取出这些片段。另一方面,您不应该在模型中完全设置密码。
  • @T.S.在第一个中,您的意思是该方法接收密码但某些序列化程序将其隐藏?而在第二种情况下,更好的方法是使用与 Client 表相关的 id 和密码不同的表?
  • 为什么在sql语句中使用_password_user而不是passworduser
  • @JialeXue-MSFT 我知道这很奇怪,但由于某种原因,我在使用passworduser 时遇到了错误。但不适用于idname...如果它有效,我猜不要改变它
  • @JialeXue-MSFT 不错。 OP 应该发布表定义

标签: c# postgresql api .net-core visual-studio-2019


【解决方案1】:

你可以让你的查询像

... birth_date, _password as "Password", _user as "User"

这样 dapper 可以将它们映射到您的不同属性名称。每当您的道具与您的列不同时,最简单的方法是使用 AS 重命名查询中的列,使其与属性匹配


..这就是使用保留字作为列名的问题。我想为了我的钱,我会称他们为 UserName 和 PasswordHash

..或者您可以查看Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true; 设置,在尝试匹配您的道具之前,该设置本质上应该从 db 列名称中去除下划线(您的许多专业人士都需要重命名)


我想我也会跳过使用下划线,而只是将我的 Postgres 列称为 BirthDate 等(但我不会使用引号来使它们成为 PascalCase;这只会让人头疼 - 像 BirthDate 这样的代码,接受只要它不区分大小写,PoatGres 会随意调用它,并保持我的 C# 属性为 pascal Cade 约定)


我知道在数据库中明确显示密码是一种不好的做法

没有理由不从 SO 中提取一些哈希算法,运行通过它提供的密码并将哈希存储在数据库中而不是密码中

甚至调用password.GetHashcode 并存储 int 比存储密码更好;您的系统安全性不会很高,但以明文形式存储密码的最大问题是人们会重复使用密码,因此当您的数据库被盗时,黑客也拥有用户在其他任何地方使用的密码。像这样的代码是 hasIBeenPwned 等网站存在的原因;即使只是获取密码的哈希码也会隐藏真正的密码,从而更好地保护重复使用密码的人

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多