当前位置: 欣欣网 > 码农

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

2024-03-17码农

在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 方法中,配置数据库连接服务:

publicvoidConfigureServices(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来执行实际的数据库操作。

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

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

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

public classDapperRepository<T> : IRepository<T>
{
privatereadonly IDbConnection _dbConnection;
privatereadonly SqlMapper.ITypeHandler<T> _typeHandler;
publicDapperRepository(IDbConnection dbConnection, SqlMapper.ITypeHandler<T> typeHandler)
{
_dbConnection = dbConnection;
_typeHandler = typeHandler;
}
publicasync Task<IEnumerable<T>> GetAllAsync()
{
returnawait _dbConnection.QueryAsync<T>(_typeHandler, "SELECT * FROM YourTableName");
}
publicasync Task<T> GetByIdAsync(int id)
{
returnawait _dbConnection.QueryFirstOrDefaultAsync<T>(_typeHandler, "SELECT * FROM YourTableName WHERE Id = @id"new { id });
}
publicasync 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);
}
publicasync 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);
}
publicasync Task DeleteAsync(int id)
{
await _dbConnection.ExecuteAsync("DELETE FROM YourTableName WHERE Id = @id"new { id });