[英]How to use Blazor Serverside with Blazor WebAssembly?
[英]How to connect Blazor WebAssembly to DataBase
我最近开始开发 Blazor WebAssembly 应用程序,现在我正在解决数据库连接问题。
所有课程和说明都说您需要在 Startup.cs 文件和 appsettings.json 中输入信息,但这些文件不在项目中。
我不明白。 在 Blazor WebAssembly 中,有没有办法连接到数据库?
不直接。 Blazor WebAssembly 是一个前端框架。 您需要创建一个 API 控制器来包装您的数据库连接并使用 HttpClient 来调用 api。 一个直接的方法是使用包装实体框架核心数据库上下文的 asp.net 核心 web api 控制器。
@inject HttpClient Http
<template_html_here/>
@code
{
protected override async Task OnInitializedAsync()
{
products = await Http.GetFromJsonAsync<Product[]>("api/Products");
}
}
控制器:
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly ProductsDbContext _context; // your database context
public ProductsController(ProductsDbContext context)
{
_context = context;
}
[HttpGet]
public IEnumerable<Product> Get()
{
return _context.Products.ToList();
}
}
您可以在https://docs.microsoft.com/en-us/aspnet/core/blazor/call-web-api?view=aspnetcore-3.1阅读有关 blazor 的更多信息。 在https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.1&tabs=visual-studio上的 asp.net 核心 Web API 上。
如果您指的是本地存储(浏览器存储),那么Chris Sainty 的这个组件可以帮助您。
但是,如果您正在寻找与 SQL Server 等数据库或 Mongo 等文档存储的连接,则无法直接完成。
Blazor Wasm 用于前端开发。 您将需要调用连接到存储在服务器上的数据库的 Web API。
现在是 2022 年。.NET 6 已经发布,并且 Blazor WebAssembly 支持已编译的二进制文件。
这意味着现在有三个选项可用于在 Blazor WebAssembly 应用程序中使用数据库。
#1。 创建一个 webApi。 正如您在默认示例中看到的那样,从客户端调用 webApi。 请参阅 FetchData.razor
protected override async Task OnInitializedAsync()
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
}
和服务器上的 WeatherForecastController.cs。 默认解决方案不调用数据库,但您可以轻松地使用 Get() 中的 dbContext 从数据库中提取数据。
#2:通过在 Blazor WebAssembly 中对编译二进制文件的支持,现在可以在 WebAssembly 中完全托管 Sqlite。
https://github.com/TrevorDArcyEvans/BlazorSQLiteWasm
#3:索引数据库。 通过js互操作,可以使用浏览器中的IndexDb。 大量的数据可以存储在这个 Db 中,并且顾名思义,它是被索引的。 由于这可能会被意外清除,因此它在 PWA 中最有用,因为这更困难。 此外,有了这个和 Sqlite,在浏览器中所做的任何事情都对用户和黑客开放,从而危及用户的机器。
我使用https://github.com/wtulloch/Blazor.IndexedDB
您在 program.cs 中添加架构:
builder.Services.AddIndexedDB(dbStore =>
{
dbStore.DbName = "SomeDbName";
dbStore.Version = 1;
dbStore.Stores.Add(new StoreSchema
{
Name = "People",
PrimaryKey = new IndexSpec { Name = "id", KeyPath = "id", Auto = false },
Indexes = new List<IndexSpec>
{
new IndexSpec{Name="alias", KeyPath = "alias", Auto=false},
new IndexSpec{Name="isAvailable", KeyPath = "isAvailable", Auto=false},
new IndexSpec{Name="communityId", KeyPath = "communityId", Auto=false},
new IndexSpec{Name="isFriend", KeyPath = "isFriend", Auto=false},
}
});
});
在这段代码中,字段的名称是驼峰式命名的,而我正在构建的对象是 PascalCase。 这实际上是我让它工作所必需的。 我认为我的序列化程序可能设置为 camelCase Json 之类的,所以请注意。
然后使用以下命令添加删除和搜索:
public async Task AddPersonAsync(LocalPerson member)
{
var newPerson = new StoreRecord<LocalPerson>
{
Data = member,
Storename = PeopleStoreName
};
await _dbManager.AddRecord(newPerson);
}
public async Task<LocalPerson> GetPersonByIdAsync(Guid id)
{
var localPerson = await _dbManager.GetRecordById<Guid, LocalPerson>(PeopleStoreName, id);
return localPerson;
}
public async Task<List<LocalPerson>> GetPeopleAsync()
{
var results = await _dbManager.GetRecords<LocalPerson>(PeopleStoreName);
return results;
}
public async Task<List<LocalPerson>> GetPeopleByCommunityAsync(Guid id)
{
var indexSearch = new StoreIndexQuery<Guid>
{
Storename = PeopleStoreName,
IndexName = "communityId",
QueryValue = id,
};
var result = await _dbManager.GetAllRecordsByIndex<Guid, LocalPerson>(indexSearch);
if (result is null)
{
return new List<LocalPerson>();
}
return (List<LocalPerson>)result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.