在.NET Core中使用Dapper进行数据库操作主要分为以下几个步骤:
---
### **1. 安装Dapper NuGet包**
通过NuGet包管理器或命令行安装Dapper:
```bash
dotnet add package Dapper
```
---
### **2. 配置数据库连接**
在 `appsettings.json` 中添加数据库连接字符串:
```json
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=YourDB;User Id=sa;Password=your_password;"
}
}
```
在代码中注入配置(如ASP.NET Core项目):
```csharp
// Program.cs 或 Startup.cs
builder.Services.AddScoped(_ => new SqlConnection(
builder.Configuration.GetConnectionString("DefaultConnection")
));
```
---
### **3. 基本查询操作**
#### **查询数据(返回集合)**
```csharp
using Dapper;
using System.Data.SqlClient;
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public async Task<IEnumerable<User>> GetUsers()
{
using var connection = new SqlConnection("YourConnectionString");
await connection.OpenAsync();
return await connection.QueryAsync<User>("SELECT Id, Name FROM Users");
}
```
#### **查询单个对象**
```csharp
public async Task<User> GetUserById(int id)
{
using var connection = new SqlConnection("YourConnectionString");
return await connection.QueryFirstOrDefaultAsync<User>(
"SELECT * FROM Users WHERE Id = @Id",
new { Id = id } // 参数化查询,防止SQL注入
);
}
```
---
### **4. 执行非查询操作(增删改)**
```csharp
public async Task<int> CreateUser(User user)
{
using var connection = new SqlConnection("YourConnectionString");
return await connection.ExecuteAsync(
"INSERT INTO Users (Name) VALUES (@Name)",
new { Name = user.Name }
);
}
```
---
### **5. 使用事务**
```csharp
public async Task UpdateUserWithTransaction(User user)
{
using var connection = new SqlConnection("YourConnectionString");
await connection.OpenAsync();
using var transaction = await connection.BeginTransactionAsync();
try
{
await connection.ExecuteAsync(
"UPDATE Users SET Name = @Name WHERE Id = @Id",
new { user.Name, user.Id },
transaction
);
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
throw;
}
}
```
---
### **6. 处理复杂查询(多表关联)**
使用 `QueryMultiple` 执行多个查询:
```csharp
public async Task<(User user, List<Order> orders)> GetUserWithOrders(int userId)
{
using var connection = new SqlConnection("YourConnectionString");
using var multi = await connection.QueryMultipleAsync(
@"SELECT * FROM Users WHERE Id = @Id;
SELECT * FROM Orders WHERE UserId = @Id",
new { Id = userId }
);
var user = await multi.ReadSingleOrDefaultAsync<User>();
var orders = (await multi.ReadAsync<Order>()).ToList();
return (user, orders);
}
```
---
### **7. 高级映射(自定义类型转换)**
如果数据库字段名与模型属性名不一致,可通过 `Column` 特性或自定义映射:
```csharp
public class User
{
[Column("user_id")] // 映射到数据库字段 user_id
public int Id { get; set; }
public string Name { get; set; }
}
// 或手动配置映射:
Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true; // 全局启用下划线命名匹配
```
---
### **8. 异步支持**
Dapper 的所有方法均有异步版本(如 `QueryAsync`、`ExecuteAsync`),推荐在ASP.NET Core中异步操作以提高性能。
---
### **完整示例代码**
```csharp
using Dapper;
using Microsoft.Data.SqlClient;
using System.Data;
public class UserRepository
{
private readonly string _connectionString;
public UserRepository(IConfiguration configuration)
{
_connectionString = configuration.GetConnectionString("DefaultConnection");
}
public async Task<User> GetUserAsync(int id)
{
using IDbConnection db = new SqlConnection(_connectionString);
return await db.QueryFirstOrDefaultAsync<User>(
"SELECT * FROM Users WHERE Id = @Id",
new { Id = id }
);
}
public async Task<int> AddUserAsync(User user)
{
using IDbConnection db = new SqlConnection(_connectionString);
return await db.ExecuteAsync(
"INSERT INTO Users (Name) VALUES (@Name)",
new { user.Name }
);
}
}
```
---
### **注意事项**
1. **连接管理**:使用 `using` 确保连接及时释放。
2. **参数化查询**:始终使用参数化查询防止SQL注入。
3. **性能优化**:Dapper通过缓存执行计划实现高性能,但复杂的映射可能需手动优化。
4. **依赖注入**:推荐通过DI注入 `IDbConnection` 或封装为Repository模式。
通过上述步骤,你可以在.NET Core中高效使用Dapper进行数据库操作!