在.NET Core中使用Dapper进行数据库操作主要分为以下几个步骤:

 

在.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进行数据库操作!

  

posted on 2025-02-18 22:51  是水饺不是水饺  阅读(66)  评论(0)    收藏  举报

导航