Dapper - 将 class names/properties 映射到数据库字段
Dapper - Mapping class names/properties to database fields
我有一个class...
public class WireTransferRequest
{
public int RequestID { get; set; }
public DateTime RequestDate { get; set; }
public string RequesterName { get; set; }
public string AuthorizerName { get; set; }
public string AuthorizerSignature { get; set; }
public DateTime TransferDate { get; set; }
public string CustomerNames { get; set; }
public string Reasons { get; set; }
public string Amounts { get; set; }
public decimal TotalOfAmounts { get; set; }
}
我有一个table.....
CREATE TABLE IF NOT EXISTS `digital_forms`.`wire_transfer_request` (
`request_id` INT NOT NULL,
`request_date` DATETIME NOT NULL,
`requester_name` VARCHAR(64) NOT NULL,
`authorizer_name` VARCHAR(64) NULL,
`authorizer_signature` VARCHAR(64) NULL,
`transfer_date` DATETIME NULL,
`customer_names` VARCHAR(64) NULL,
`customer_reasons` VARCHAR(128) NULL,
`customer_amounts` VARCHAR(128) NULL,
`total_of_customer_amounts` DECIMAL(19,2) NULL,
PRIMARY KEY (`request_id`),
INDEX `idx_request_date` (`request_date` ASC) VISIBLE,
INDEX `idx_requestor_name` (`requestor_name` ASC) VISIBLE)
ENGINE = InnoDB
我有一个问题...
public override void Add(WireTransferRequest request)
{
if (request == null)
throw new ArgumentNullException(nameof(request));
request.RequestID = _transaction.Connection.ExecuteScalar<int>(
"INSERT INTO wire_transfer_request(request_date, requester_name, authorizer_name," +
"authorizer_signature, transfer_date, customer_names," +
"customer_reasons, customer_amounts, total_of_customer_amounts" +
"VALUES (@request_date, @requester_name, @authorizer_name," +
"@authorizer_signature, @transfer_date, @customer_names," +
"@customer_reasons, @customer_amounts, @total_of_customer_amounts; SELECT SCOPE_IDENTITY()",
new
{
request_date = request.RequestDate,
requester_name = request.RequesterName,
authorizer_name = request.AuthorizerName,
authorizer_signature = request.AuthorizerSignature,
transfer_date = request.TransferDate,
customer_names = request.CustomerNames,
customer_reasons = request.Reasons,
customer_amounts = request.Amounts,
total_of_customer_amounts = request.TotalOfAmounts,
},
_transaction
);
}
我希望 Dapper 能够正确识别和映射列和 table 名称。对此进行快速 Google 搜索会发现很多旧的、旧的结果,所以我很好奇是否有更新的(如果可能的话)solution/work。
我已经尝试使用 MatchNamesWithUnderscores 映射器,但它无法通过插入获得我想要的结果。
我不是 Dapper 大师,但这是我的想法。
选项 0。有效
您的 sql 中缺少 2 个 )
。
以下代码段有效。
var sql = "INSERT INTO wire_transfer_request(request_date, requester_name, authorizer_name," +
"authorizer_signature, transfer_date, customer_names," +
"customer_reasons, customer_amounts, total_of_customer_amounts)" +
"VALUES (@request_date, @requester_name, @authorizer_name," +
"@authorizer_signature, @transfer_date, @customer_names," +
"@customer_reasons, @customer_amounts, @total_of_customer_amounts); SELECT SCOPE_IDENTITY()";
var o = new
{
request_date = DateTime.UtcNow,
requester_name = "X",
authorizer_name = "Y",
authorizer_signature = "Sig",
transfer_date = DateTime.UtcNow,
customer_names = "Z",
customer_reasons = "A",
customer_amounts = "B",
total_of_customer_amounts = 10m,
};
var inserted = conn.ExecuteScalar(sql, o);
inserted
包含新插入行的 request_id
。
选项 1. table
的 class
Insert
(不是本回答的核心)来自官方Dapper.Contrib.
[Table("wire_transfer_request")]
public class WireTransferRequest2
{
public int request_id { get; set; }
public DateTime request_date { get; set; }
public string requester_name { get; set; }
public string authorizer_name { get; set; }
public string authorizer_signature { get; set; }
public DateTime transfer_date { get; set; }
public string customer_names { get; set; }
public string customer_reasons { get; set; }
public string customer_amounts { get; set; }
public decimal total_of_customer_amounts { get; set; }
}
using Dapper.Contrib.Extensions;
(...)
var o = new WireTransferRequest2
{
request_id = 1,
request_date = DateTime.UtcNow,
requester_name = "X",
authorizer_name = "Y",
authorizer_signature = "Sig",
transfer_date = DateTime.UtcNow,
customer_names = "Z",
customer_reasons = "A",
customer_amounts = "B",
total_of_customer_amounts = 10m,
};
conn.Insert(o);
选项 2. 使用 ColumnAttribute
详情见 Manually map column names with class properties。
我有一个class...
public class WireTransferRequest
{
public int RequestID { get; set; }
public DateTime RequestDate { get; set; }
public string RequesterName { get; set; }
public string AuthorizerName { get; set; }
public string AuthorizerSignature { get; set; }
public DateTime TransferDate { get; set; }
public string CustomerNames { get; set; }
public string Reasons { get; set; }
public string Amounts { get; set; }
public decimal TotalOfAmounts { get; set; }
}
我有一个table.....
CREATE TABLE IF NOT EXISTS `digital_forms`.`wire_transfer_request` (
`request_id` INT NOT NULL,
`request_date` DATETIME NOT NULL,
`requester_name` VARCHAR(64) NOT NULL,
`authorizer_name` VARCHAR(64) NULL,
`authorizer_signature` VARCHAR(64) NULL,
`transfer_date` DATETIME NULL,
`customer_names` VARCHAR(64) NULL,
`customer_reasons` VARCHAR(128) NULL,
`customer_amounts` VARCHAR(128) NULL,
`total_of_customer_amounts` DECIMAL(19,2) NULL,
PRIMARY KEY (`request_id`),
INDEX `idx_request_date` (`request_date` ASC) VISIBLE,
INDEX `idx_requestor_name` (`requestor_name` ASC) VISIBLE)
ENGINE = InnoDB
我有一个问题...
public override void Add(WireTransferRequest request)
{
if (request == null)
throw new ArgumentNullException(nameof(request));
request.RequestID = _transaction.Connection.ExecuteScalar<int>(
"INSERT INTO wire_transfer_request(request_date, requester_name, authorizer_name," +
"authorizer_signature, transfer_date, customer_names," +
"customer_reasons, customer_amounts, total_of_customer_amounts" +
"VALUES (@request_date, @requester_name, @authorizer_name," +
"@authorizer_signature, @transfer_date, @customer_names," +
"@customer_reasons, @customer_amounts, @total_of_customer_amounts; SELECT SCOPE_IDENTITY()",
new
{
request_date = request.RequestDate,
requester_name = request.RequesterName,
authorizer_name = request.AuthorizerName,
authorizer_signature = request.AuthorizerSignature,
transfer_date = request.TransferDate,
customer_names = request.CustomerNames,
customer_reasons = request.Reasons,
customer_amounts = request.Amounts,
total_of_customer_amounts = request.TotalOfAmounts,
},
_transaction
);
}
我希望 Dapper 能够正确识别和映射列和 table 名称。对此进行快速 Google 搜索会发现很多旧的、旧的结果,所以我很好奇是否有更新的(如果可能的话)solution/work。
我已经尝试使用 MatchNamesWithUnderscores 映射器,但它无法通过插入获得我想要的结果。
我不是 Dapper 大师,但这是我的想法。
选项 0。有效
您的 sql 中缺少 2 个 )
。
以下代码段有效。
var sql = "INSERT INTO wire_transfer_request(request_date, requester_name, authorizer_name," +
"authorizer_signature, transfer_date, customer_names," +
"customer_reasons, customer_amounts, total_of_customer_amounts)" +
"VALUES (@request_date, @requester_name, @authorizer_name," +
"@authorizer_signature, @transfer_date, @customer_names," +
"@customer_reasons, @customer_amounts, @total_of_customer_amounts); SELECT SCOPE_IDENTITY()";
var o = new
{
request_date = DateTime.UtcNow,
requester_name = "X",
authorizer_name = "Y",
authorizer_signature = "Sig",
transfer_date = DateTime.UtcNow,
customer_names = "Z",
customer_reasons = "A",
customer_amounts = "B",
total_of_customer_amounts = 10m,
};
var inserted = conn.ExecuteScalar(sql, o);
inserted
包含新插入行的 request_id
。
选项 1. table
的 classInsert
(不是本回答的核心)来自官方Dapper.Contrib.
[Table("wire_transfer_request")]
public class WireTransferRequest2
{
public int request_id { get; set; }
public DateTime request_date { get; set; }
public string requester_name { get; set; }
public string authorizer_name { get; set; }
public string authorizer_signature { get; set; }
public DateTime transfer_date { get; set; }
public string customer_names { get; set; }
public string customer_reasons { get; set; }
public string customer_amounts { get; set; }
public decimal total_of_customer_amounts { get; set; }
}
using Dapper.Contrib.Extensions;
(...)
var o = new WireTransferRequest2
{
request_id = 1,
request_date = DateTime.UtcNow,
requester_name = "X",
authorizer_name = "Y",
authorizer_signature = "Sig",
transfer_date = DateTime.UtcNow,
customer_names = "Z",
customer_reasons = "A",
customer_amounts = "B",
total_of_customer_amounts = 10m,
};
conn.Insert(o);
选项 2. 使用 ColumnAttribute
详情见 Manually map column names with class properties。