在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 });