ITPub博客

首页 > 数据库 > 数据库开发技术 > ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

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

原创 数据库开发技术 作者:后端Q 时间:2024-03-16 00:00:00 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 });


原文作者:后端Q;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-01-22

  • 博文量
    1540
  • 访问量
    726403