如何在Dapper的CRUD操作中使用Dapper.FluentMap?
使用Dapper.FluentMap实现CRUD及属性映射实操指南
我之前在做Clean Architecture项目替换Dapper.Contrib为Dapper.FluentMap时,也碰到过文档不全的问题,折腾了一阵才摸清楚实操的路子,给你分享下具体的步骤和技巧:
1. 先搞定基础配置
- 首先确保你已经通过NuGet安装了
Dapper和Dapper.FluentMap两个包 - 在项目启动的时候(比如Program.cs或者Startup类的配置阶段),需要注册你的映射配置,举个实际的例子:
// 注册所有实体的映射类 FluentMapper.Initialize(config => { config.AddMap(new CustomerMap()); config.AddMap(new OrderMap()); // 把其他需要映射的实体类都加在这里 });
2. 编写实体与数据库表的映射类
假设你有一个Customer实体,对应的数据库表是tbl_customers,表字段是customer_id、full_name、email,那映射类可以这么写:
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




