问题
如何在C#项目中配置并使用数据库,以关系型数据库为例?
前置条件
- 基于
.Net 6.0创建的C#Demo - 主要目录结构如下
DemoApplication
|---> src
|---> repository
|---> IUserRepository.cs
|---> UserRepository.cs
|---> Program.cs
|---> demo.csproj
|---> appsettings.json
|---> Extension.cs
数据库配置
1. 使用docker安装数据库(可选)
使用docker在本地安装关系型数据库
# 步骤 1
docker pull mcr.microsoft.com/mssql/server:2019-latest
# 步骤 2
docker create -v /var/opt/mssql --name mssqldatavol mcr.microsoft.com/mssql/server:2019-latest /bin/true
# 步骤 3
docker run -d --volumes-from mssqldatavol --name sql_server_demo -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=password' -p 1433:1433 mcr.microsoft.com/mssql/server:2019-latest
2. 引入与数据库相关的包
// demo.csproj
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4" />
<PackageReference Include="EFCore.BulkExtensions" Version="7.0.1" />
</ItemGroup>
3. 配置连接
在appsettings.json中配置数据的账号等信息
//appsettings.json
"ConnectionStrings": {
"DefaultConnection": "Data Source=localhost,1433;Initial Catalog=DB;User ID=xx;Password=xxx;TrustServerCertificate=True"
}
创建Extension.cs连接数据库,使用appsettings.json中的账号信息
// Extension.cs
public static class Extensions
{
public static void AddEntityFrameworkCore(this IServiceCollection services, IConfiguration configuration)
{
services.AddDbContext<SqlDbContext>( options =>
options.UseSqlServer(
configuration.GetConnectionString("DefaultConnection"),
sqlOptions =>
{
sqlOptions.CommandTimeout(300);
sqlOptions.EnableRetryOnFailure(10, TimeSpan.FromSeconds(30), null);
})
);
}
}
在Program.cs中增加有关数据库的配置,这样在项目中就可以连接数据库了
//Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEntityFrameworkCore(builder.Configuration, builder.Environment);
4. 定义Repository层获取数据
在IUserRepository.cs接口文件中定义所需要的接口
// IUserRepository.cs
public interface IUserRepository
{
public Task<UserDto> GetUserByIdAsync(Guid id);
}
在UserRepository.cs文件中实现接口方法内容
// UserRepository.cs
public class UserRepository : IUserRepository
{
private readonly SqlDbContext Context;
public UserRepository(SqlDbContext Context)
{
this.Context = Context;
}
private async Task<UserDto> GetUserByIdAsync(Guid id, CancellationToken ct = default)
{
return await Context.Users
.Where(a => a.id == id)
.ToArrayAsync(ct);
}
}
在Program.cs文件中声明IUserRepository, UserRepository
//Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IUserRepository, UserRepository>();