網站長春網站建設惠州網絡推廣平臺
本文主要是使用異步方式,體驗
litedb
基本的crud
操作。
LiteDB
是一款輕量級、快速且免費的 .NET NoSQL
嵌入式數據庫,專為小型本地應用程序設計。它以單一數據文件的形式提供服務,支持文檔存儲和查詢功能,適用于桌面應用、移動應用和小型 Web
應用等場景。
LiteDB
的主要特點包括:
- 無服務器的 NoSQL 文檔存儲:
LiteDB
是一個嵌入式數據庫,無需獨立服務器,數據存儲在一個單一文件中,類似于SQLite
。 - 簡單易用的 API:
LiteDB
提供類似MongoDB
的簡單API
,支持LINQ
查詢和SQL-like
命令,使得開發(fā)者可以輕松上手。 - 線程安全和 ACID 事務支持:LiteDB 支持線程安全操作和完整的
ACID
事務處理,確保數據的一致性和完整性。 - 數據恢復功能:
LiteDB
使用寫前日志(WAL
)機制來保證數據恢復能力,即使在寫入失敗的情況下也能恢復數據。 - 跨平臺支持:
LiteDB
可以在Windows、Linux 和 macOS
等多個平臺上運行,具有良好的跨平臺兼容性。 - 加密存儲:
LiteDB
支持使用DES
或AES
加密算法對數據文件進行加密,保障數據的安全性。 - 文件和流數據存儲:
LiteDB
支持存儲文件和流數據,類似于MongoDB
的GridFS
功能。 - 開源免費:
LiteDB
是一個開源(MIT
)項目,任何人都可以使用和修改其代碼,并且完全免費,包括商業(yè)用途。
LiteDB
的使用非常簡單,可以通過 NuGet
包管理器輕松安裝,并且提供了豐富的文檔和示例代碼幫助開發(fā)者快速上手。此外,LiteDB
還提供了一個名為 LiteDB Studio
的圖形用戶界面工具,方便用戶管理和可視化數據庫內容。
總之,LiteDB
是一款功能強大、易于使用的 NoSQL
數據庫解決方案,適用于多種場景,值得開發(fā)者關注和嘗試。
使用 .NET CLI
創(chuàng)建一個控制臺應用程序,可以按照以下步驟進行:
-
安裝
.NET 9 SDK
:首先,確保你已經安裝了.NET 9 SDK
。你可以從官方網站下載并安裝最新版本的.NET SDK
。 -
創(chuàng)建新的控制臺應用程序:使用
dotnet new console
命令創(chuàng)建一個新的控制臺應用程序。這個命令會生成一個包含基本結構的項目文件夾。
dotnet new console -n LiteDBExample
- 導航到項目目錄:進入剛剛創(chuàng)建的項目目錄。
cd LiteDBExample
- 運行應用程序:使用
dotnet run
命令運行應用程序。
dotnet run
基礎控制臺項目就創(chuàng)建好了,絲滑般體驗;
接下來我們使用 litedb
提供的 nuget
包,進行簡單的封裝,構建出異步操作的 crud
方法 。
- 安裝相關
nuget
包:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net9.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable></PropertyGroup><ItemGroup><PackageReference Include="LiteDB" Version="5.0.21" /><PackageReference Include="LiteDB.Async" Version="0.1.8" /><PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" /></ItemGroup></Project>
- 創(chuàng)建實體類型 :
Person
public class Person
{public Guid Id { get; set; } = Guid.NewGuid();public string Name { get; set; } = default!;public uint Age { get; set; }
}
- 定義倉儲類規(guī)范:
IRepository
using LiteDB;namespace LiteDBExample.Core.Interfaces;public interface IRepository<TEntity> where TEntity : class
{Task<BsonValue> AddAsync(TEntity entity);Task<int> AddRangeAsync(IEnumerable<TEntity> entities);Task<IEnumerable<TEntity>> GetAllAsync();Task<TEntity?> GetByIdAsync(object id);Task<bool> UpdateAsync(TEntity entity);Task<int> UpdateRangeAsync(IEnumerable<TEntity> entities);Task<bool> DeleteAsync(object id);Task<int> DeleteRangeAsync(IEnumerable<object> ids);
}
- 實現(xiàn)
PersonDbContext
using LiteDB;
using LiteDB.Async;
using LiteDBExample.Core.Entities;namespace LiteDBExample.Data;public class PersonDbContext(string connectionString) : IDisposable
{private readonly LiteDatabaseAsync _database = new(connectionString);public Task<BsonValue> AddAsync(Person person){var collection = _database.GetCollection<Person>("people");return collection.InsertAsync(person);}public Task<int> AddRangeAsync(IEnumerable<Person> persons){var collection = _database.GetCollection<Person>("people");return collection.InsertAsync(persons);}public Task<IEnumerable<Person>> GetAllAsync(){var collection = _database.GetCollection<Person>("people");return collection.FindAllAsync();}public Task<Person?> GetByIdAsync(object id){BsonValue bsonId = new(id);var collection = _database.GetCollection<Person>("people");return collection.FindByIdAsync(bsonId);}public Task<bool> UpdateAsync(Person person){var collection = _database.GetCollection<Person>("people");return collection.UpdateAsync(person);}public Task<int> UpdateRangeAsync(IEnumerable<Person> persons){var collection = _database.GetCollection<Person>("people");return collection.UpdateAsync(persons);}public Task<bool> DeleteAsync(object id){BsonValue bsonId = new(id);var collection = _database.GetCollection<Person>("people");return collection.DeleteAsync(bsonId);}public Task<int> DeleteRangeAsync(IEnumerable<object> ids){var collection = _database.GetCollection<Person>("people");return collection.DeleteManyAsync(a => ids.Contains(a.Id));}public void Dispose(){_database.Dispose();}
}
- 定義
Person
類倉儲:IPersonRepository
using LiteDBExample.Core.Entities;
using LiteDBExample.Core.Interfaces;namespace LiteDBExample.Repositories;public interface IPersonRepository : IRepository<Person>
{
}
- 實現(xiàn)
Person
類倉儲:PersonRepository
using LiteDB;
using LiteDBExample.Core.Entities;
using LiteDBExample.Data;namespace LiteDBExample.Repositories;public class PersonRepository(PersonDbContext context) : IPersonRepository
{private readonly PersonDbContext _context = context ?? throw new ArgumentNullException(nameof(context));public Task<BsonValue> AddAsync(Person entity){return _context.AddAsync(entity);}public Task<int> AddRangeAsync(IEnumerable<Person> entities){return _context.AddRangeAsync(entities);}public Task<IEnumerable<Person>> GetAllAsync(){return _context.GetAllAsync();}public Task<Person?> GetByIdAsync(object id){return _context.GetByIdAsync(id);}public Task<bool> UpdateAsync(Person entity){return _context.UpdateAsync(entity);}public Task<int> UpdateRangeAsync(IEnumerable<Person> entities){return _context.UpdateRangeAsync(entities);}public Task<bool> DeleteAsync(object id){return _context.DeleteAsync(id);}public Task<int> DeleteRangeAsync(IEnumerable<object> ids){return _context.DeleteRangeAsync(ids);}
}
- 在
Program.cs
中應用IPersonRepository
using LiteDBExample.Core.Entities;
using LiteDBExample.Repositories;
using Microsoft.Extensions.DependencyInjection;
using LiteDBExample.Data;namespace LiteDBExample;internal class Program
{static async Task Main(string[] args){Console.WriteLine("Hello, LiteDB!");var services = new ServiceCollection();ConfigureServices(services);using var serviceProvider = services.BuildServiceProvider();var personRepository = serviceProvider.GetRequiredService<IPersonRepository>();// 多個 Personvar newPeople = new List<Person>{new Person { Name = "John Kiny", Age = 16 },new Person { Name = "John Doe", Age = 30 },new Person { Name = "Jane Smith", Age = 28 },new Person { Name = "Alice Johnson", Age = 35 }};try{Console.WriteLine("===> litedb Async Method Test");{// 添加單個 Personvar person = new Person { Name = "Alice Array", Age = 32 };var bsonId = await personRepository.AddAsync(person);Console.WriteLine($"bsonId={bsonId}");// 查詢單個 Personvar queryPerson = await personRepository.GetByIdAsync(bsonId);Console.WriteLine($"guid={queryPerson.Id}, {queryPerson.Name} is {queryPerson.Age} years old.");// 更新單個 Personperson.Age += 1;person.Name = "Array";var updateCount = await personRepository.UpdateAsync(person);Console.WriteLine($"updateCount={updateCount}");// 刪除單個 Personvar deleteCount = await personRepository.DeleteAsync(bsonId);Console.WriteLine($"deleteCount={deleteCount}");// 批量添加多個 Personint addRange = await personRepository.AddRangeAsync(newPeople);Console.WriteLine($"addRange={addRange}");// 查詢所有 Personvar people = await personRepository.GetAllAsync();foreach (var p in people){Console.WriteLine($"guid={p.Id}, {p.Name} is {p.Age} years old.");}// 批量更新多個 Personvar updatedPeople = people.Select(p => new Person { Id = p.Id, Name = p.Name, Age = p.Age + 1 });int updateRows = await personRepository.UpdateRangeAsync(updatedPeople);Console.WriteLine($"updateRows={updateRows}");// 批量刪除多個 Personvar idsToDelete = new List<object>();foreach (var item in people.Select(p => p.Id)){idsToDelete.Add(item);};var ids = idsToDelete.AsEnumerable();int deleteRows = await personRepository.DeleteRangeAsync(ids);Console.WriteLine($"deleteRows={deleteRows}");}Console.ReadLine();}catch (Exception ex){Console.WriteLine($"An error occurred: {ex.Message}");}}private static void ConfigureServices(IServiceCollection services){services.AddScoped<IPersonRepository, PersonRepository>();services.AddScoped<PersonDbContext>(provider => new PersonDbContext("filename=litedb_example.db"));}
}
- 運行應用:
dotnet run
- 使用
LiteDB.Studio
工具查看litedb
數據;
當批量添加數據的時候,查看數據信息如下:
Grid
查看
Text
查看
從上圖中可以看到 litedb_example.db
文件非常輕量,大概 30kb
左右;