分部类重载构造函数未调用致DbContext Factory空引用问题
问题原因及解决方案
核心问题分析
- EF Core从数据库加载
Individual实体时,只会调用无参构造函数,你定义的带IDbContextFactory<ChargingContext>的重载构造函数根本不会被执行,所以_factory始终为null。 Individual是数据实体类,不属于依赖注入(DI)容器管理的服务范畴,DI系统不会自动为实体实例注入依赖,只有注册到DI的服务类才会被DI处理。
方案一:将业务逻辑移到服务层(推荐)
实体类应仅负责数据承载,业务逻辑放到服务层更符合单一职责原则,同时避免实体与DbContext的耦合:
// 在你的服务类中新增方法 public bool IndividualHasBills(int individualId) { using (var context = _factory.CreateDbContext()) { return context.ExistingBills.Where(x => x.IndividualId == individualId).Any(); } } // 调用逻辑修改为 public void BuildModel(int id) { var individual = _service.GetIndividual(id); var hasBills = _service.IndividualHasBills(id); }
方案二:手动注入DbContextFactory(不推荐)
若必须在实体中保留HasBills方法,可在获取实体后手动为_factory赋值,但此方式会破坏实体的纯粹性,增加耦合度:
// 修改扩展分部类,为_factory添加可访问的赋值入口 public partial class Individual { private IDbContextFactory<ChargingContext> _factory; // 添加公共setter(或内部setter,根据命名空间调整访问权限) public IDbContextFactory<ChargingContext> Factory { set => _factory = value; } public bool HasBills() { using (var context = _factory.CreateDbContext()) { return context.ExistingBills.Where(x => x.IndividualId == id).Any(); } } } // 调用时手动注入工厂 public Individual BuildModel(int id, IDbContextFactory<ChargingContext> factory) { var individual = _service.GetIndividual(id); individual.Factory = factory; var hasBills = individual.HasBills(); return individual; }
方案三:利用EF Core导航属性(若已配置关联)
如果Individual与ExistingBills已配置一对多导航属性,可直接在查询时加载关联数据,避免额外数据库查询:
// 服务类中修改GetIndividual方法,包含关联数据 public Individual GetIndividual(int id) { using (var context = _factory.CreateDbContext()) { return context.Individuals .Include(i => i.ExistingBills) // 加载关联的账单数据 .FirstOrDefault(i => i.id == id); } } // 实体中直接判断导航属性 public partial class Individual { // 假设自动生成类中已有导航属性:public ICollection<ExistingBill> ExistingBills { get; set; } public bool HasBills() { return ExistingBills?.Any() ?? false; } }
内容的提问来源于stack exchange,提问作者bruceiow
相关产品推荐
相关产品推荐

