我添加了一个具有授权的.NET Core Blazor项目。该项目添加了用于迁移、注册和登录组件等的脚手架文件...
我尝试通过运行将表添加到 SQL Server
dotnet ef database update
但我收到此错误:
无法创建类型为“”的“DbContext”。尝试激活“MyProject.Data.ApplicationDbContext”时出现异常“无法解析类型“Microsoft.EntityFrameworkCore.DbContextOptions`1[MyProject.Data.ApplicationDbContext]”的服务。”尝试创建实例时抛出。
这是我的
ApplicationDbContext
课
public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : IdentityDbContext<ApplicationUser>(options)
{
}
这是 Program.cs 实现
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
我在谷歌或这里找不到相关结果。我是否遗漏了什么以及如何修复它?
编辑:我认为脚手架文件存在问题,因此无法运行迁移,所以我创建了一个新的 blazor 项目,这次,我是苹果来运行它。所以迁移错误是由于我添加了一个更改,但在排除故障时错过了它。
为了更好地理解,我有多个项目,并且创建了一个类库项目 -ClassLibrary1- 来保存这些项目之间的共享功能。
但是当我尝试在 blazor 应用程序中使用
ClassLibrary1.Data.ApplicationDbContext
-BlazorApp1- 时,我收到错误。
因为有多个文件,所以我创建了解决方案的简化版本。请参考存储库
将
builder.Services.AddSingleton<SegmentService>();
添加到我的 Program.cs
后,就会出现错误
我想使用
ClassLibrary1
中存在的
ApplicationDbContext
和ApplicationUser
在
SegmentService
中我们注入private readonly ApplicationDbContext _dbContext;
,这样我们使用builder.Services.AddSingleton<SegmentService>();
应该是正确的。我检查了你的项目并重现了你的错误。
那是因为您还有许多其他服务,例如
builder.Services.AddScoped<IdentityUserAccessor>();
,它基于您在 blazor 项目中定义的 ApplicationDbContext
,而不是您在类库中定义的服务。如果我在类库中使用 ApplicationDbContext,我会收到如下错误:
所以我的想法是我们可以继续使用您在blazor项目中定义的
ApplicationDbContext
,然后将ISegmentService
更改为使用Task<IEnumerable<Segment>> GetSegmentsAsync(int? id, ApplicationDbContext dbcontext);
,然后我们可以在调用类库中定义的方法时将ApplicationDbContext设置为参数.