添加数据库数据时触发System.ArgumentNullException(entitySet),请求排查
排查System.ArgumentNullException: Value cannot be null. Parameter name: entitySet异常
嘿,我来帮你搞定这个报错!你遇到的System.ArgumentNullException: Value cannot be null. Parameter name: entitySet,大概率是你的DbContext实例或者DbSet没正确初始化导致的,咱们一步步排查:
最可能的原因:DbContext实例未正确初始化
看你控制器里的代码Db.actores.Add(actors);,这里的Db变量如果是未初始化的静态/全局变量,那actores这个DbSet自然就是null,调用Add方法时就会触发这个异常。
修复方案:正确初始化DbContext
修改你的控制器代码,确保在使用DbContext前先实例化它:
public class YourControllerName : Controller { // 声明DbContext实例 private readonly CinemaDbContext _dbContext; // 在构造函数中初始化DbContext public YourControllerName() { _dbContext = new CinemaDbContext(); } public ActionResult Actors() { return View(); } [HttpPost] public ActionResult Actors(Actors actors) { // 先验证模型数据是否合法(推荐步骤) if (ModelState.IsValid) { _dbContext.actores.Add(actors); _dbContext.SaveChanges(); // 重定向到列表页,避免用户刷新重复提交数据 return RedirectToAction("ActorsList"); } // 如果模型验证失败,返回原页面并保留用户输入的数据 return View(actors); } }
其他需要检查的点
1. 确认连接字符串配置正确
你的CinemaDbContext构造函数用了base("DefaultConnection"),要确保配置文件里存在这个连接字符串:
- 如果是ASP.NET MVC(.NET Framework),检查
Web.config:<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=你的数据库服务器;Initial Catalog=你的数据库名;Integrated Security=True;" providerName="System.Data.SqlClient" /> </connectionStrings> - 如果是ASP.NET Core,检查
appsettings.json:"ConnectionStrings": { "DefaultConnection": "Server=你的数据库服务器;Database=你的数据库名;Trusted_Connection=True;" }
2. 可选:使用依赖注入管理DbContext(推荐)
如果你的项目支持,用依赖注入来管理DbContext的生命周期会更规范,还能避免手动实例化的问题:
- 在项目启动类(比如
Global.asax或Program.cs)注册CinemaDbContext:// 以ASP.NET MVC 5为例,用Unity容器 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); // 注册DbContext var container = new UnityContainer(); container.RegisterType<CinemaDbContext>(new HierarchicalLifetimeManager()); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); } - 然后在控制器构造函数中注入:
public class YourControllerName : Controller { private readonly CinemaDbContext _dbContext; // 构造函数注入DbContext public YourControllerName(CinemaDbContext dbContext) { _dbContext = dbContext; } // 后续方法和之前一样... }
3. 检查DbSet命名(可选优化)
你的DbSet命名是actores,实体类的表名是actors_tb,虽然EF能自动映射,但为了代码可读性,你可以把DbSet的名字改成Actors,这样更符合常规命名习惯:
public class CinemaDbContext:DbContext { public CinemaDbContext() : base("DefaultConnection") { } public DbSet<Actors> Actors { get; set; } // 这里改成Actors public DbSet<Producers> Producer { get; set; } public DbSet<movie> movies { get; set; } }
内容的提问来源于stack exchange,提问作者AKHIL NAMBIAR
相关产品推荐
相关产品推荐

