【问题标题】:Dapper - Mapping class names/properties to database fieldsDapper - 将类名/属性映射到数据库字段
【发布时间】:2019-11-08 04:42:08
【问题描述】:

我有课……

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

我有一张桌子....

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 能够正确识别和映射列名和表名。对此的快速谷歌搜索会出现很多旧的旧结果,所以我很好奇更新(如果可能的话)解决方案/解决这个问题。

我尝试使用 MatchNamesWithUnderscores 映射器,但它没有达到我想要的插入结果。

【问题讨论】:

  • 使用 ClassMapper 会有帮助的

标签: c# asp.net dapper


【解决方案1】:

我不是 Dapper 大师,但这是我的想法。

选项 0。有效

您的 sql 中缺少 2 个)

以下 sn-p 有效。

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. 表的类

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多