當前位置: 妍妍網 > 碼農

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