.Net基础系列(四):关系型数据库配置

131 阅读1分钟

问题

如何在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>();