ASP.NET Core 6 MVC项目SqlNullValueException报错求助
ASP.NET Core 6 MVC SqlNullValueException问题求助
我正在开发ASP.NET Core 6 MVC项目,遇到了SqlNullValueException错误,错误信息为:Data is Null. This method or property cannot be called on Null values。这是我的作业,已经尝试修改ClubController和ClubRepository代码,但问题仍未解决,相关代码如下:
ClubController 代码
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using webHomework.Data; using webHomework.Interfaces; using webHomework.Models; using webHomework.ViewModels; namespace webHomework.Controllers { public class ClubController : Controller { private readonly IClubRepository _clubRepository; private readonly IPhotoService _photoService; public ClubController(IClubRepository clubRepository, IPhotoService photoService) { _clubRepository = clubRepository; _photoService = photoService; } public async Task<IActionResult> Index() { IEnumerable<Club> clubs = await _clubRepository.GetAll(); return View(clubs); } public async Task<IActionResult> Detail(int id) { Club club = await _clubRepository.GetByIdAsync(id); return View(club); } public IActionResult Create() { return View(); } [HttpPost] public async Task<IActionResult> Create(CreateClubViewModel clubVM) { if (ModelState.IsValid) { var result = await _photoService.AddPhotoAsync(clubVM.Image); var club = new Club { Title = clubVM.Title, Description = clubVM.Description, Image = result.Url.ToString(), Address = new Address { Street = clubVM.Address.Street, City = clubVM.Address.City, State = clubVM.Address.State, } }; _clubRepository.Add(club); return RedirectToAction("Index"); } else { ModelState.AddModelError("", "Photo upload failed"); } return View(clubVM); } } }
ClubRepository 代码
using Microsoft.EntityFrameworkCore; using webHomework.Data; using webHomework.Interfaces; using webHomework.Models; namespace webHomework.Repository { public class ClubRepository : IClubRepository { private readonly ApplicationDbContext _context; public ClubRepository (ApplicationDbContext context) { _context = context; } public bool Add(Club club) { _context.Add(club); return Save(); } public bool Delete(Club club) { _context.Remove(club); return Save(); } public async Task<IEnumerable<Club>> GetAll() { return await _context.Clubs.ToListAsync(); } public async Task<Club> GetByIdAsync(int id) { return await _context.Clubs.Include(i => i.Address).FirstOrDefaultAsync(i => i.Id == id); } public async Task<IEnumerable<Club>> GetClubByCity(string city) { return await _context.Clubs.Where(c => c.Address.City.Contains(city)).ToListAsync(); } public bool Save() { var saved = _context.SaveChanges(); return saved > 0 ? true : false; } public bool Update(Club club) { _context.Update(club); return Save(); } } }
问题原因分析
- 实体类与数据库字段可空性不匹配:如果
Club或Address实体类中存在非可空属性(比如public string City { get; set; }),但数据库中对应字段允许为NULL,EF Core读取时会抛出该异常。 - 查询未关联导航属性:
GetAll方法没有IncludeAddress,如果数据库中某条Club记录的Address为NULL,而实体类中Address属性是非可空的,会触发错误。 - 空引用访问:
GetClubByCity方法直接访问c.Address.City,如果Address本身为NULL,会引发空引用,同时如果City字段为NULL且实体类属性非可空,也会触发SqlNullValueException。
解决方案
修正实体类属性可空性
打开Club和Address实体类,将允许为空的属性改为可空类型:// Address类示例 public class Address { public int Id { get; set; } public string? Street { get; set; } public string? City { get; set; } public string? State { get; set; } public Club? Club { get; set; } } // Club类示例 public class Club { public int Id { get; set; } public string Title { get; set; } public string Description { get; set; } public string Image { get; set; } public Address? Address { get; set; } // 如果允许Club没有Address,改为可空 }完善仓储查询方法
- 更新
GetAll方法,关联Address:public async Task<IEnumerable<Club>> GetAll() { return await _context.Clubs.Include(i => i.Address).ToListAsync(); } - 更新
GetClubByCity方法,增加空值判断:public async Task<IEnumerable<Club>> GetClubByCity(string city) { return await _context.Clubs .Include(i => i.Address) .Where(c => c.Address != null && c.Address.City != null && c.Address.City.Contains(city)) .ToListAsync(); }
- 更新
检查数据库数据
确认数据库中Clubs和Addresses表的关联数据,避免NULL值对应到实体类的非可空属性。如果新增数据时允许部分字段为空,确保实体类属性已设置为可空。
内容的提问来源于stack exchange,提问作者Lambersonistaken
相关产品推荐
相关产品推荐

