图解 在 .NET 8.0 的 Blazor Web App 项目模板中使用 Entity Framework Core(EF Core) 访问 SQLite 数据库:工厂模式
在 .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.官网学习资料
Entity Framework Core 概述 - EF Core | Microsoft Learn
七、对象模式链接
图解 在 .NET 8.0 的 Blazor Web App 项目模板中使用 Entity Framework Core(EF Core) 访问 SQLite 数据库:对象模式-CSDN博客
更多推荐
已为社区贡献1条内容
所有评论(0)