为什么在 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 { });
}
但是 password
和 user
属性在数据库中有值时到达 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 这样的网站存在的原因;即使只是获取密码的哈希码也会隐藏真实密码,从而更好地保护重复使用密码的人
好的,所以我在 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 { });
}
但是 password
和 user
属性在数据库中有值时到达 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 这样的网站存在的原因;即使只是获取密码的哈希码也会隐藏真实密码,从而更好地保护重复使用密码的人