ApplicationDbContext为空引发NullReferenceException,求解决方案
修复ApplicationDbContext为空的NullReferenceException问题
嘿,我一眼就看到问题出在哪了——你现在手动用无参构造函数创建Maintenance实例的方式,让依赖注入根本没机会把ApplicationDbContext注入进去,所以Context才会是null,调用DoMaintenance的时候自然就抛空引用异常了。咱们一步步来修复:
1. 修正Maintenance类的构造函数
首先,你要删掉无参构造函数,只保留带ApplicationDbContext参数的构造函数,还可以加个空检查提前发现问题:
namespace Club.BLL.MaintenanceBLL { public class Maintenance { private readonly Club.Data.ApplicationDbContext Context; // 只保留依赖注入用的构造函数,添加空检查避免后续问题 public Maintenance(ApplicationDbContext context) { Context = context ?? throw new ArgumentNullException(nameof(context), "Context不能为null,请确保依赖注入已配置"); } public void DoMaintenance() { // 现在Context已经被正确注入,这行代码不会再报错了 var maintenances = Context.Maintenance; // 后续的维护逻辑继续写在这里 } }
删掉无参构造函数是为了避免你不小心再用错误的方式实例化这个类,从源头杜绝问题。
2. 在服务容器中注册Maintenance类
你的Startup.cs已经注册了ApplicationDbContext,但还需要告诉依赖注入容器怎么创建Maintenance实例。在ConfigureServices方法里加一行注册代码:
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>(); // 注册Maintenance类,使用Scoped生命周期(和DbContext的生命周期保持一致) services.AddScoped<Maintenance>(); }
3. 修改Index页面的调用方式
不要自己手动new Maintenance(),而是通过构造函数注入的方式获取Maintenance实例:
public class IndexModel : PageModel { private readonly Maintenance _maintenance; // 让依赖注入容器把配置好的Maintenance实例传进来 public IndexModel(Maintenance maintenance) { _maintenance = maintenance; } public void OnGet() { _maintenance.DoMaintenance(); } }
为什么这样能解决问题?
你之前的错误在于绕过了依赖注入容器:当你自己new一个类的时候,容器没有机会把它需要的依赖(这里就是ApplicationDbContext)传递进去,导致Context始终是null。而依赖注入的核心逻辑就是让容器来管理所有对象的创建和依赖传递,只要你把类注册到容器里,并且通过构造函数声明依赖,容器就会自动帮你把所有需要的实例准备好。
内容的提问来源于stack exchange,提问作者Alan Laird
相关产品推荐
相关产品推荐

