You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向ViewModel的DbSet添加数据时出现NullReferenceException异常求助

问题分析与解决方案

问题根源

你在ViewModel中使用了DbSet<T>类型的属性,但DbSet是Entity Framework框架中绑定数据库上下文的集合类型,它的实例化由EF上下文负责。当你手动实例化ProfilKorisnika时,teme属性默认是null,所以调用Add方法会触发NullReferenceException。

解决步骤

1. 修改ViewModel的集合类型

将ViewModel中的DbSet替换为普通的集合类型(比如List<T>),因为ViewModel仅用于向视图传递数据,不需要EF的数据库操作能力:

public class ProfilKorisnika
{
    // 直接初始化集合,避免null
    public List<TemeKorisnika> teme { get; set; } = new List<TemeKorisnika>();
    public List<PKorisnika> profil { get; set; } = new List<PKorisnika>();
}

或者通过构造函数初始化(适合需要额外逻辑的场景):

public class ProfilKorisnika
{
    public List<TemeKorisnika> teme { get; set; }
    public List<PKorisnika> profil { get; set; }

    public ProfilKorisnika()
    {
        teme = new List<TemeKorisnika>();
        profil = new List<PKorisnika>();
    }
}

2. 优化控制器代码

不需要逐个遍历添加,直接将查询结果转为List赋值,更高效:

public ActionResult MojeTeme() 
{
    var db = new Palindrom.Models.Baza1Entities();
    var db1 = new Palindrom.Models.Entities();

    var db2 = new Palindrom.VjuModeli.ProfilKorisnika();

    // 直接将查询结果转为List赋值给teme
    db2.teme = db.PalindromBaza.Select(m => new Palindrom.VjuModeli.TemeKorisnika 
    { 
        Korisnik = m.Korisnik, 
        ID = m.ID, 
        Naslov = m.Naslov 
    }).ToList();

    // 后续可按相同逻辑填充profil数据
    // db2.profil = db1.XXX.Select(...).ToList();

    return View(db2);
}

额外说明

  • DbSet是EF用于数据库CRUD操作的组件,依赖于EF上下文的生命周期,不适合在ViewModel中使用。
  • 所有集合类型的ViewModel属性都应该显式初始化,避免空引用问题。

内容的提问来源于stack exchange,提问作者potatomen D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:07:07