JAL*_*JAL 11 c# sqlite blazor blazor-webassembly
对于 Blazor WebAssembly,我提出了使用 SQLite 的想法。这个问题提到这是不可能的。是否可以在 Blazor WebAssembly 中使用 SQLite?如果可以,如何使用?
小智 13
从 .NET 6 开始,您可以在 Blazor WebAssembly 中使用包含本机依赖项,其中一个例子就是 SQLite。请参阅此处的示例代码:https://github.com/SteveSandersonMS/BlazeOrbital/blob/6b5f7892afbdc96871c974eb2d30454df4febb2c/BlazeOrbital/ManufacturingHub/Properties/NativeMethods.cs#L6
首先.Net 6
,现在可以使用SQLite
with Blazor Web Assembly
。
以下是步骤,
Microsoft.EntityFrameworkCore.Sqlite
b. SQLitePCLRaw.bundle_e_sqlite3
- 截至发布此答案时目前处于预览状态。这个包是为了NativeFileReference
避免e_sqlite3.o
..csproj
以避免弹出不需要的警告。<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<EmccExtraLDFlags>-s WARN_ON_UNDEFINED_SYMBOLS=0</EmccExtraLDFlags>
Run Code Online (Sandbox Code Playgroud)
Program.cs
。这是避免运行时异常所必需的 -Could not find method 'AddYears' on type 'System.DateOnly'
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<EmccExtraLDFlags>-s WARN_ON_UNDEFINED_SYMBOLS=0</EmccExtraLDFlags>
Run Code Online (Sandbox Code Playgroud)
数据库模型:
public partial class Program
{
/// <summary>
/// FIXME: This is required for EF Core 6.0 as it is not compatible with trimming.
/// </summary>
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
private static Type _keepDateOnly = typeof(DateOnly);
}
Run Code Online (Sandbox Code Playgroud)
数据库上下文:
public class Name
{
public int Id { get; set; }
public string FullName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
页面/组件:
<button @onclick="RunEfCore">Run Ef Core</button>
@code {
private async Task RunEfCore()
{
var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = ":memory:" };
var connection = new SqliteConnection(connectionStringBuilder.ToString());
var options = new DbContextOptionsBuilder<TestDbCOntext>()
.UseSqlite(connection)
.Options;
using var db = new TestDbCOntext(options);
db.Database.OpenConnection();
await db.Database.EnsureCreatedAsync();
var nextId = db.Names!.Count() + 1;
db.Names.Add(new Name { Id = nextId, FullName = "Abdul Rahman" });
await db.SaveChangesAsync();
Console.WriteLine();
await foreach (var name in db.Names.AsAsyncEnumerable())
{
Console.WriteLine(name.FullName);
}
db.Database.CloseConnection();
}
}
Run Code Online (Sandbox Code Playgroud)
IndexedDB
浏览器同步来保存在您的服务器中。示例工作演示可以在我的 Github 存储库中找到- BlazorWasmEfCore
请参阅github 问题以获取完整的历史记录。
需要考虑的要点:
以下详细信息取自以下stackoverflow 答案。
一个好的编程规则是 KISS - 保持简单。因此,如果 Linq to Objects 满足了应用程序的要求,那么使用 SQLite 使其复杂化似乎是错误的做法。
然而,在视频中 Steve S. 确实提出了适合使用 SQLite 的要求参数 - 应用程序需要处理:
因此,关于使用 SQLite 的 Blazor 应用程序的优势的问题的答案很简单:
小智 1
您的 Blazor WebAssembly C# 代码仍然在浏览器的沙箱中运行,这意味着不允许打开本地驱动器上的文件。
Blazor WebAssembly 具有与任何常规网站相同的计算机访问权限。
即使有人将 SQLite 移植到 WebAssembly,您也无法打开数据库文件。
对于客户端计算机上的存储,您仅限于本地存储,其大小限制为 5 MB(每个浏览器品牌可能有所不同),并且只能包含字符串。但这不是一个可靠的选择,因为当用户清除缓存、浏览器历史记录等时,数据将被删除。
您唯一的选择是将数据存储在服务器上。