You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Dapper的CRUD操作中使用Dapper.FluentMap?

使用Dapper.FluentMap实现CRUD及属性映射实操指南

我之前在做Clean Architecture项目替换Dapper.Contrib为Dapper.FluentMap时,也碰到过文档不全的问题,折腾了一阵才摸清楚实操的路子,给你分享下具体的步骤和技巧:

1. 先搞定基础配置

  • 首先确保你已经通过NuGet安装了DapperDapper.FluentMap两个包
  • 在项目启动的时候(比如Program.cs或者Startup类的配置阶段),需要注册你的映射配置,举个实际的例子:
// 注册所有实体的映射类
FluentMapper.Initialize(config =>
{
    config.AddMap(new CustomerMap());
    config.AddMap(new OrderMap());
    // 把其他需要映射的实体类都加在这里
});

2. 编写实体与数据库表的映射类

假设你有一个Customer实体,对应的数据库表是tbl_customers,表字段是customer_idfull_nameemail,那映射类可以这么写:

public class CustomerMap : EntityMap<Customer>
{
    public CustomerMap()
    {
        // 映射实体属性到数据库列
        Map(c => c.Id).ToColumn("customer_id");
        Map(c => c.FullName).ToColumn("full_name");
        // 如果有不需要映射到数据库的属性(比如计算属性),直接忽略
        Map(c => c.IsActive).Ignore();
    }
}

这里要注意,映射类必须继承EntityMap<T>,然后在构造函数里逐个配置属性和列的对应关系。

3. 结合Dapper做CRUD操作

配置好映射后,就可以正常使用Dapper的原生方法来做CRUD了,FluentMap会自动帮你处理属性和数据库列的映射,不用手动在SQL里写复杂的列名对应:

查询示例

public async Task<Customer> GetCustomerById(int id)
{
    using var connection = new SqlConnection(_connectionString);
    const string sql = "SELECT * FROM tbl_customers WHERE customer_id = @Id";
    // 直接用实体的属性名传参,FluentMap会自动转成对应的数据库列名
    return await connection.QueryFirstOrDefaultAsync<Customer>(sql, new { Id = id });
}

新增示例

public async Task<int> CreateCustomer(Customer customer)
{
    using var connection = new SqlConnection(_connectionString);
    const string sql = @"INSERT INTO tbl_customers (full_name, email) 
                         VALUES (@FullName, @Email);
                         SELECT SCOPE_IDENTITY();";
    // 直接传入实体对象,FluentMap会自动匹配对应的列名
    return await connection.ExecuteScalarAsync<int>(sql, customer);
}

更新示例

public async Task<int> UpdateCustomer(Customer customer)
{
    using var connection = new SqlConnection(_connectionString);
    const string sql = @"UPDATE tbl_customers 
                         SET full_name = @FullName, email = @Email
                         WHERE customer_id = @Id";
    return await connection.ExecuteAsync(sql, customer);
}

删除示例

public async Task<int> DeleteCustomer(int id)
{
    using var connection = new SqlConnection(_connectionString);
    const string sql = "DELETE FROM tbl_customers WHERE customer_id = @Id";
    return await connection.ExecuteAsync(sql, new { Id = id });
}

4. 实用小技巧

  • 如果你的实体和数据库表的命名规则是统一的(比如实体用驼峰命名,数据库用下划线命名),可以试试Dapper.FluentMap.Dommel扩展包,它支持按命名规则自动映射,不用一个个写映射类,能省不少事
  • 调试映射问题时,可以开启FluentMap的日志功能,查看实际的映射逻辑:
// 开启日志
FluentMapper.Configuration.EnableLogging();
// 监听日志事件
FluentMapper.Configuration.LogReceived += (sender, args) =>
{
    // 输出日志信息到控制台或者日志系统
    Console.WriteLine($"FluentMap Log: {args.Message}");
};

内容的提问来源于stack exchange,提问作者user3928241

火山引擎 最新活动