Blazor Server App中EF无法识别ArcadiaLogging实体的问题
解决方案:EF Core无法识别ArcadiaLogging实体(Blazor Server .NET 8)
核心问题排查与修复步骤
1. 移除错误的实体服务注册
你在Program.cs里注册了ArcadiaLogging为Scoped服务,这完全没必要——实体类不需要注册到DI容器,这会干扰EF Core的实体跟踪逻辑:
// 删掉这行代码 builder.Services.AddScoped<ArcadiaLogging>();
2. 确保DbSet正确初始化
你的ArcadiaContext中ArcadiaLoggings属性没有初始化,在.NET 8的非空引用类型规则下,EF Core可能无法正确识别这个实体。修改为:
// 初始化DbSet,避免EF忽略它 public DbSet<ArcadiaLogging> ArcadiaLoggings { get; set; } = null!;
或者保留可空(但推荐初始化):
public DbSet<ArcadiaLogging>? ArcadiaLoggings { get; set; }
3. 检查实体是否被EF加载
查看应用启动时控制台输出的Registered Entity Types:列表,如果没有ArcadiaLogging,说明EF没扫描到这个实体:
- 若实体类和
ArcadiaContext不在同一个程序集,在OnModelCreating中手动注册:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Gc_ReferenceDrugsDb>() .HasKey(g => new { g.BNF_Drug_ID, g.DmdId, g.VmppId }); // 手动添加实体 modelBuilder.Entity<ArcadiaLogging>(); } - 确认实体类没有被排除在项目之外(比如.csproj里的
<Compile Remove>设置)。
4. 替换泛型Add为显式DbSet.Add
把_dbContext.Add(log);改为显式调用对应的DbSet,避免EF的实体类型推断出错:
// 替换之前的_dbContext.Add(log); _dbContext.ArcadiaLoggings.Add(log); await _dbContext.SaveChangesAsync();
5. 验证迁移与数据库同步
- 删除旧的迁移文件,重新创建迁移:
Add-Migration AddArcadiaLoggingEntity Update-Database - 确认数据库中
ArcadiaLoggings表结构与模型匹配(比如Id字段是自增主键)。
6. Blazor Server生命周期检查
Blazor Server的Scoped服务是绑定到Circuit的,确保:
- 你没有在组件中直接注入
ArcadiaContext,而是通过服务层(比如你的日志服务)注入; - 重启应用清空Circuit缓存,避免旧的DbContext实例残留。
额外验证
执行这些步骤后,再次运行应用,检查控制台输出的实体列表是否包含ArcadiaLogging,然后测试日志写入逻辑。如果还是报错,检查_dbContext实例是否正确注入(避免手动创建DbContext)。
内容的提问来源于stack exchange,提问作者Bluetonic
相关产品推荐
相关产品推荐

