Blazor Server 与 LiteDB 实现增删改查

LiteDB是一个轻量级、嵌入式的 NoSQL 数据库引擎,用于 .NET 和 .NET Core 平台。它是使用 C# 编写的,旨在提供简单、快速、可嵌入的数据存储解决方案。今天,我们将学习如何使用 LiteDB 作为 Blazor Server 的存储,并使用它执行简单的 CRUD 操作。在 BlazorApp 项目添加 LiteDB 包。创建一个 Data 和 LiteDB 两个文件夹,然后在 Data 文件夹添加一个 ILiteDbContext 接口。接口代码如下:

using LiteDB;
namespace BlazorApp.Data{ public interface ILiteDbContext { ILiteCollection<TEntity> Collection<TEntity>() where TEntity : class; }}

接着,再创建一个实现 ILiteDBContext 接口的类( LiteDBContext )和 LiteDbOptions  。实现代码如下:

//LiteDbContext 类
using LiteDB;using Microsoft.Extensions.Options;
namespace BlazorApp.Data{ public class LiteDbContext : ILiteDbContext {
readonly ILiteDatabase _database;
public LiteDbContext(IOptions<LiteDbOptions> options) { _database = new LiteDatabase(options.Value.DatabaseLocation); }
public ILiteCollection<TEntity> Collection<TEntity>() where TEntity : class { return _database.GetCollection<TEntity>(typeof(TEntity).Name); } }}//LiteDbOptions 类#nullable disablenamespace BlazorApp.Data{ public class LiteDbOptions { public string DatabaseLocation { get; set; } }}

紧接着,更新 Program 类:

builder.Services.Configure<LiteDbOptions>(builder.Configuration.GetSection("LiteDb"));builder.Services.AddSingleton<ILiteDbContext, LiteDbContext>();

由于LiteDB仅适用于单用户应用程序,因此这里使用单例模式来最大化 LiteDB 的性能。再配置下 LiteDB 的存放的路径,打开 appsettings.json ,更新内容如下:

"LiteDb": {  "DatabaseLocation": "LiteDb/Lih.db"}

我们在 Models 文件夹下创建一个 Role 类,该类的信息如下:

#nullable disable
using System.ComponentModel.DataAnnotations;
namespace BlazorApp.Models{ public class Role { public int Id { get; set; }
[Required(ErrorMessage = "角色名称不能为空")] [MaxLength(100,ErrorMessage ="角色名称最大为 60 个字符")] public string Name { get; set; }
[MaxLength(100, ErrorMessage = "角色描述最大为 200 个字符")] public string Description { get; set; } }}

开始画页面,具体代码如下:

@page "/admin/role"@inject Data.ILiteDbContext liteDb@inject IMessageService _message@inject ModalService _modalService
@attribute [Authorize]
<PageTitle>角色管理</PageTitle>

<!--工具栏和列表展示--><Space Direction="DirectionVHType.Vertical" Style="width:100%;"> <SpaceItem> <Space> <SpaceItem><Button @onclick="()=>New(null)">新建</Button></SpaceItem> </Space> </SpaceItem> <SpaceItem> <Table TItem="Models.Role" DataSource="@roles" Bordered=@true Size=@TableSize.Middle Loading="@loading"> <PropertyColumn Title="名称" Property="c=>c.Name" Width="200"></PropertyColumn> <PropertyColumn Title="描述" Property="c=>c.Description"></PropertyColumn> <ActionColumn Title="操作"> <Space> <SpaceItem><Button OnClick="()=>New(context)">修改</Button></SpaceItem> <SpaceItem> <Button Danger @onclick="@(()=>Remove(context.Id))">删除</Button> </SpaceItem> </Space> </ActionColumn> </Table> </SpaceItem></Space>

<!--角色信息编辑--><Modal Title="@title" Visible="@visible" MaskClosable="false" DestroyOnClose="true" OnCancel="HandleCancel" OnOk="HandleOk" Keyboard="false" Closable="false"> <Form Model="@roleInfo" @ref="_form" LabelColSpan="4" WrapperColSpan="18"> <FormItem Label="名称" Required> <Input @bind-Value="@context.Name" /> </FormItem> <FormItem Label="描述"> <TextArea Rows="4" MaxLength="100" @bind-Value="@context.Description" /> </FormItem> </Form></Modal>
@code { IEnumerable<Models.Role> roles=new List<Models.Role>(); bool loading = true; string title="新建角色"; bool save = false; bool visible=false; Models.Role roleInfo = new();
Form<Models.Role> _form = new();

protected override void OnInitialized() { base.OnInitialized();
LoadData(); }
/// <summary> /// 加载角色数据 /// </summary> /// <param name="role"></param> void LoadData() { loading = true; roles = liteDb.Collection<Models.Role>().FindAll(); loading = false; }
/// <summary>    /// 点击新建和修改按扭影响方法 /// </summary> /// <param name="role"></param> void New(Models.Role? role) { if (role == null) { roleInfo = new(); title = "新建角色"; } else { roleInfo = role; title = "角色修改"; }
visible = true; }
RenderFragment icon = @<Icon Type="exclamation-circle" Theme="outline"></Icon>;
/// <summary> /// 删除角色 /// </summary> /// <param name="id"></param> /// <returns></returns> async Task Remove(int id) { var isOk = await _modalService.ConfirmAsync(new ConfirmOptions() { Title = "您确定要删除该角色?", Icon = icon });
if (isOk) { liteDb.Collection<Models.Role>().Delete(id); LoadData(); await _message.Success("角色信息删除成功"); } else { await _message.Info("您已取消删除该角色");
} }
/// <summary> /// 对话框点击确定按扭响应方法 /// 新增和更新保存 /// </summary> void HandleOk() { if (_form.EditContext.Validate()) { if (roleInfo.Id > 0) liteDb.Collection<Models.Role>().Update(roleInfo); else liteDb.Collection<Models.Role>().Insert(roleInfo);
LoadData(); visible = false; _message.Success("角色信息保存成功"); } else { _message.Info("角色信息验证失败"); } }
/// <summary> /// 关闭对话框 /// </summary> void HandleCancel() { visible = false; }}

由于 LiteDB 适用于原型、小型项目或单用户场景,对于大型项目和多用户程序就要考虚其它数据库。创建好 ILiteDbContext 后,整个开发过程很简单,只要画下界面可以。因此,用来做原型是非常合适。好了,今天就到这。最后,祝大家学习愉快!

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/221747.html

联系我们
联系我们
分享本页
返回顶部