图解 在 .NET 8.0 的 Blazor Web App 项目模板中使用 Entity Framework Core(EF Core) 访问 SQLite 数据库:工厂模式

一、使用 NuGet 添加引用  Microsoft.EntityFrameworkCore.Sqlite、Microsoft.EntityFrameworkCore.Tools

图1-1 打开 NuGet 窗口

图1-2 添加 Microsoft.EntityFrameworkCore.Sqlite 引用

图1-3 添加  Microsoft.EntityFrameworkCore.Tools 引用

 二、创建实体:为使用方便,在项目中创建 Entity 文件夹,存放“实体”文件、数据“上下文”文件、“全局引用”文件

图2-1:Entity 文件夹结构,其中包含 4 个示例代码文件

//注1:global using 是全局引用,对当前项目有效。
//注2:可以放在任何 .cs 文件中,包括 Program.cs 或专门命名的文件(例如本例中的 GlobalUsings.cs )。

//实体定义注解引用
global using System.ComponentModel;
global using System.ComponentModel.DataAnnotations;

//EF Core 引用
global using Microsoft.EntityFrameworkCore;
//本项目实体引用
global using BlazorWebAppWithBB.Entity;

示例代码2-1:“全局引用”文件 GlobalUsings.cs

注1:为了简化代码,对于常见引用,本示例使用 global using 供项目内的所有组件共享,并存放在 独立的 GlobalUsings.cs 文件中。
注2:示例代码2-1、2-2、2-3、2-4 中的 BlazorWebAppWithBB 是项目名称,可以根据自己的项目进行修改,也可以保留不变。
namespace BlazorWebAppWithBB.Entity;

[Description("用户信息表")]
[Index(nameof(UserName), IsUnique = true)]
[Index(nameof(Email))]
public class User(string UserName)
{
    public long Id { get; set; }
    [Required]
    public string UserName { get; set; } = UserName;
    public string? Password { get; set; }
    public string? Email { get; set; }

    //一个用户可以拥有多个角色
    public List<Role> Roles { get; set; } = [];
}

示例代码2-2:用户信息表 User.cs

namespace BlazorWebAppWithBB.Entity;

[Description("角色信息表")]
public class Role
{
    public long Id { get; set; }
    [Required]
    public string RoleName { get; set; } = "新角色";
    public string RoleDescription { get; set; } = string.Empty;
    public bool IsEnable { get; set; } = true;

    //一个角色可以分配给多个用户
    public List<User> Users { get; set; } = [];

}

示例代码2-3:角色信息表 Role.cs

namespace BlazorWebAppWithBB.Entity;

public class MyAppDbContext(DbContextOptions options) : DbContext(options)
{
    //此处根据实体指定数据集:数据集名称即为数据库中的数据表名称。
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
}


示例代码2-4:数据上下文 MyAppDbContext.cs

三、在 Program.cs 文件中注册数据上下文,指定数据库配制信息

............
............
............
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();

//注册 MyAppDbContext,指定数据库配制信息:数据库类型(SQLite)、数据库名称(SQLiteFile.db)
builder.Services.AddDbContextFactory<MyAppDbContext>(opt => opt.UseSqlite("Data Source=SQLiteFile.db"));

var app = builder.Build();
............
............
............

示例代码3-1:在 Program.cs 中注册 DbContext

注1:示例中指定的数据库文件名为 SQLiteFile.db ,执行迁移命令后自动生成,位于项目文件夹中。
注2:如果要使用 MySQl、SQLServer 等其它数据库,只需要修改此处,不用修改实体、数据上下文,方便将项目转移到其它数据库。

四、执行数据库迁移命令,创建数据库

1. 打开“程序包管理器控制台”

图4-1:菜单位置

2.生成数据库迁移代码

图4-2:执行命令 Add-Migration InitialDatbaseXXX

注:迁移代码保存文件名称 InitialDatbaseXXX 每次都要不同,可以根据内容取名称,方便以后查看。

图4-3:命令 Add-Migration 自动创建 Migrations 文件夹,并在其中存放生成的代码文件

3.执行数据库迁移代码

图4-4:命令 Update-Database 执行成功

图4-5:执行迁移代码后,自动生成的数据库

图4-6:生成数据库文件后,将其属性“复制到输出目录”设置为“如果较新则复制”

注:每次修改实体定义后,都要再次生成迁移代码、执行迁移代码命令,将修改应用到数据库中。
生成迁移代码:Add-Migration    InitialDatbaseXXX
执行迁移代码:Update-Database

五、在 xxx.razor 文件中访问数据库

1.注入工厂

@page "/counter"
@rendermode InteractiveServer

@* 工厂变量名称 DbFactory 根据自己的喜好修改 *@
@inject IDbContextFactory<MyAppDbContext> DbFactory

<PageTitle>Counter</PageTitle>

............
............
............

示例代码5-1:使用 @inject 注入数据工厂

 2.创建上下文、通过上下文件操作数据库

............
............
............


<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;

        // 根据需要编写代码
        using var dbContext = DbFactory.CreateDbContext();

        dbContext.Add(new Role { RoleName = "管理员" });
        dbContext.Add(new Role { RoleName = "用户" });

        dbContext.SaveChanges();

        Role gly = dbContext.Roles.Single(r => r.RoleName == "管理员");
        Role yh = dbContext.Roles.Single(r => r.RoleName == "用户");

        dbContext.Add(new User("张三") { Password = "123", Roles = [gly, yh] });
        dbContext.Add(new User("李四") { Password = "456", Roles = [gly] });
        dbContext.Add(new User("王五") { Password = "789", Roles = [yh] });
        dbContext.Add(new User("赵六") { Password = "321" });

        dbContext.SaveChanges();

    }
}

示例代码5-2:使用数据工厂创建数据上下文,使用数据上下文执行增加、编辑、删除、查询等数据操作

六、更多数据操作参见 EF Core 官网

 1.常用操作

(1)查询所有实体:dbContext.数据集.ToList()

(2)查询单个实体:dbContext.数据集.Single(...)

(3)查询时包含关连实体数据:

dbContext.数据集.Include(...)

dbContext.数据集.Include(...).Single(...)

查询数据 - EF Core | Microsoft Learn

(4)增加实体:dbContext.Add...

(5)删除实体:dbContext.Remove...

(6)增加、修改、删除后保存到数据库

dbContext.SaveChanges()

await dbContext.SaveChangesAsync()

保存数据 - EF Core | Microsoft Learn

2.官网学习资料

实体框架文档中心 | Microsoft Learn

Entity Framework Core 概述 - EF Core | Microsoft Learn

七、对象模式链接

http://t.csdnimg.cn/wa1Xh

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值