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

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();
        }
    }
}

问题原因分析

  1. 实体类与数据库字段可空性不匹配:如果Club或Address实体类中存在非可空属性(比如public string City { get; set; }),但数据库中对应字段允许为NULL,EF Core读取时会抛出该异常。
  2. 查询未关联导航属性:GetAll方法没有IncludeAddress,如果数据库中某条Club记录的Address为NULL,而实体类中Address属性是非可空的,会触发错误。
  3. 空引用访问:GetClubByCity方法直接访问c.Address.City,如果Address本身为NULL,会引发空引用,同时如果City字段为NULL且实体类属性非可空,也会触发SqlNullValueException。

解决方案

  1. 修正实体类属性可空性
    打开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,改为可空
    }
    
  2. 完善仓储查询方法

    • 更新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();
      }
      
  3. 检查数据库数据
    确认数据库中Clubs和Addresses表的关联数据,避免NULL值对应到实体类的非可空属性。如果新增数据时允许部分字段为空,确保实体类属性已设置为可空。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:10:32