程序员的知识教程库

网站首页 > 教程分享 正文

ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

henian88 2024-08-15 05:00:31 教程分享 23 ℃ 0 评论

在ASP.NET Core应用程序中,数据访问是核心功能之一。Dapper是一个轻量级的对象关系映射(ORM)库,它提供了高效且灵活的数据访问方式。通过使用Dapper,我们可以简化数据库操作,提高性能,并更好地控制SQL查询。本文将介绍如何在ASP.NET Core应用程序中基于Dapper扩展数据访问方法。

一、引入Dapper依赖

首先,我们需要在ASP.NET Core项目中引入Dapper的依赖。通过NuGet包管理器,可以方便地添加Dapper的引用。在项目根目录下打开终端或命令提示符,并运行以下命令:

dotnet add package Dapper

这将把Dapper库添加到项目的依赖中。

二、配置数据库连接

在ASP.NET Core中,我们通常使用依赖注入来管理数据库连接。首先,我们需要定义一个数据库连接字符串,并将其配置在appsettings.json文件中:

{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=mydatabase;User Id=myuser;Password=mypassword;"
}
}

然后,在Startup.cs文件的ConfigureServices方法中,配置数据库连接服务:

public void ConfigureServices(IServiceCollection services)
{
// ... 其他服务配置 ...

var connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(connectionString));

services.AddScoped<IDbConnection>(provider =>
{
var dbContext = provider.GetService<MyDbContext>();
return dbContext.Database.GetDbConnection();
});

// ... 其他服务配置 ...
}

在上面的代码中,我们使用了Entity Framework Core的DbContext来获取数据库连接,并将其注册为作用域服务。这样,我们就可以在控制器或其他服务中通过依赖注入获取IDbConnection实例。

三、创建Dapper仓储接口和实现

接下来,我们需要创建Dapper仓储接口和相应的实现类。仓储接口定义了数据访问的方法,而实现类则使用Dapper来执行实际的数据库操作。

首先,定义一个简单的仓储接口:

public interface IRepository<T>
{
Task<IEnumerable<T>> GetAllAsync();
Task<T> GetByIdAsync(int id);
Task AddAsync(T entity);
Task UpdateAsync(T entity);
Task DeleteAsync(int id);
}

然后,创建一个实现该接口的类,并使用Dapper来执行数据库操作:

public class DapperRepository<T> : IRepository<T>
{
private readonly IDbConnection _dbConnection;
private readonly SqlMapper.ITypeHandler<T> _typeHandler;

public DapperRepository(IDbConnection dbConnection, SqlMapper.ITypeHandler<T> typeHandler)
{
_dbConnection = dbConnection;
_typeHandler = typeHandler;
}

public async Task<IEnumerable<T>> GetAllAsync()
{
return await _dbConnection.QueryAsync<T>(_typeHandler, "SELECT * FROM YourTableName");
}

public async Task<T> GetByIdAsync(int id)
{
return await _dbConnection.QueryFirstOrDefaultAsync<T>(_typeHandler, "SELECT * FROM YourTableName WHERE Id = @id", new { id });
}

public async Task AddAsync(T entity)
{
string sql = "INSERT INTO YourTableName (Column1, Column2, ...) VALUES (@Property1, @Property2, ...)";
var parameters = new DynamicParameters();
// 映射实体属性到参数
// parameters.Add("@Property1", entity.Property1);
// ...
await _dbConnection.ExecuteAsync(sql, parameters);
}

public async Task UpdateAsync(T entity)
{
string sql = "UPDATE YourTableName SET Column1 = @Property1, Column2 = @Property2, ... WHERE Id = @Id";
var parameters = new DynamicParameters();
// 映射实体属性到参数,包括Id
// parameters.Add("@Property1", entity.Property1);
// ...
// parameters.Add("@Id", entity.Id);
await _dbConnection.ExecuteAsync(sql, parameters);
}

public async Task DeleteAsync(int id)
{
await _dbConnection.ExecuteAsync("DELETE FROM YourTableName WHERE Id = @id", new { id });


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表