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 disable
namespace 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