如何将 Blazor WebAssembly 连接到数据库

Евг*_*нко 7 c# database-connection blazor-webassembly

我最近开始开发 Blazor WebAssembly 应用程序,现在我正在解决数据库连接问题。

所有课程和说明都说您需要在 Startup.cs 文件和 appsettings.json 中输入信息,但这些文件不在项目中。

我不明白。在 Blazor WebAssembly 中,有没有办法连接到数据库?

cod*_*107 9

不直接。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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

控制器:

 [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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以在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 上。


Par*_*Joe 8

现在是 2022 年。.NET 6 已经发布,Blazor WebAssembly 支持已编译的二进制文件。

这意味着现在可以在 Blazor WebAssembly 应用程序中使用数据库的三种选项。

#1. 创建一个 webApi。从客户端调用 webApi,正如您在默认示例中看到的那样。请参阅 FetchData.razor

protected override async Task OnInitializedAsync()
{
    forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
}
Run Code Online (Sandbox Code Playgroud)

和服务器上的 WeatherForecastController.cs。默认解决方案不调用数据库,但您可以轻松地在 Get() 中使用 dbContext 从数据库中提取数据。

#2:通过 Blazor WebAssembly 中对已编译二进制文件的支持,现在可以在 WebAssembly 中完全托管 Sqlite。

https://github.com/TrevorDArcyEvans/BlazorSQLiteWasm

#3:IndexedDb。通过js互操作,可以使用浏览器中的IndexDb。这个Db中可以存储大量的数据,顾名思义,它是有索引的。由于这可能会被意外清除,因此它在 PWA 中最有用,而这在 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},
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

在此代码中,字段的名称采用驼峰命名法,而我正在构造的对象采用 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;
}
Run Code Online (Sandbox Code Playgroud)