为什么在 ASP.NET 中有些属性到达 null 而其他属性不使用 get 方法?

Why some attributes arrive null and others not using get method in ASP.NET?

好的,所以我在 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 属性在数据库中有值时到达 null。这是我得到的回复:

[
  {
    "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。

这是 table 定义:

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)
);

谢谢!

您可以这样查询

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

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


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

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


我想我也会跳过使用下划线,只是将我的 Postgres 列命名为 BirthDate 等(但我不会使用引号使它们成为 PascalCase;这只会让人头疼 - 像 BirthDate 这样的代码,接受 PoatGres 会随心所欲地调用它,只要它不区分大小写,并让我的 C# 道具符合 Pascal Cade 约定)


I know it's a bad practice having passwords explicit in the database

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

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