我正在使用 .NET 8 编写 Blazor WASM 应用程序。今天,我尝试将数据库数据的获取添加到我的应用程序中,但我似乎无法让 Entity Framework Core 工作。我一如既往地使用相同的库。
我像往常一样写下了所有内容,但我似乎找不到问题。当我尝试运行应用程序并尝试使用
OnInitializedAsync
方法从上下文中获取数据时,我在控制台中收到以下错误:
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
未处理的异常渲染组件:类型 MySql.Data.EntityFrameworkCore.Infrastruct.Internal.MySQLOptionsExtension+ExtensionInfo 具有无效的 vtable 方法槽 5,且方法为 none System.TypeLoadException:类型 MySql.Data.EntityFrameworkCore.Infrastruct.Internal.MySQLOptionsExtension+ExtensionInfo 具有无效的 vtable 方法槽 5,且方法为 none
在 Microsoft.EntityFrameworkCore.DbContextOptions.GetHashCode()
在 System.Collections.Concurrent.ConcurrentDictionary2[[System.IServiceProvider、System.ComponentModel、版本=8.0.0.0、Culture=neutral、PublicKeyToken=b03f5f7f11d50a3a]、[System.Collections.Generic.IDictionary2[[Microsoft.EntityFrameworkCore.Infrastructure.IDbContextOptions, Microsoft.EntityFrameworkCore, Version=8.0.8.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.ValueTuple
2] (IDbContextOptions 键,Func2[[System.String, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].GetOrAdd[ValueTuple
2 工厂参数)3 valueFactory, ValueTuple
在 Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.GetOrAdd(IDbContextOptions 选项,布尔providerRequired)
在 Microsoft.EntityFrameworkCore.DbContext.get_ContextServices() 在 Microsoft.EntityFrameworkCore.DbContext.get_Model()
在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet1[[MyProject.Components.Models.Player, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].CheckState()1[[MyProject.Components.Models.Player, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].get_EntityType() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet
在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet1[[MyProject.Components.Models.Player, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].System.Collections.Generic.IEnumerable.GetEnumerator( ) 在 System.Collections.Generic.List1[[MyProject.Components.Models.Player, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].get_EntityQueryable() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet
1 集合) 在 System.Linq.Enumerable.ToList[Player](IEnumerable`1 源) 在 C:\Users\FilipMráz\source 中的 MyProject.Pages.Home.OnInitializedAsync() epos\MyProject\MyProject\Pages\Home.razor:第 112 行 在 Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()1[[MyProject.Components.Models.Player, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]..ctor(IEnumerable
这是代码:
protected override async Task OnInitializedAsync()
{
var a = context.CreateDbContext().Players.ToList();
foreach (var item in a)
{
Console.WriteLine(item.Id);
}
}
这是我的
DbContext
和DbSet的实体:
public class CustomDbContext : DbContext
{
public DbSet<Player> Players { get; set; }
public DbSet<Tournament> Tournaments { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL("myConString");
}
}
[Table("Players")]
public class Player
{
public int Id { get; set; }
}
Blazor WebAssembly 应用程序在 WebAssembly/浏览器沙箱中运行,从而阻止大多数直接数据库连接。因此,我们无法直接与 SQL Server 数据库交互或在客户端使用 Entity Framework Core (EF Core)。
要在 Blazor WebAssembly 应用程序中使用 EF core,您可以创建 ASP.NET Core Web API 或 Blazor Server 应用程序作为后端,然后在 Blazor WebAssembly 客户端中使用
HttpClient
调用 API 方法获取或发送数据。
此外,您还可以尝试使用 Blazor Web App Template 创建 Blazor Web 应用程序,然后选择 Auto(Server 和 WebAssembly)模式,如下所示:
之后,在服务器应用程序中,您可以使用 EF core 并创建 API 端点(不要忘记在 Program.cs 中启用相关的中间件和服务):