存储库模式中的 System.nullreferenceException


在存储库模式 System.NullReferenceException 中
删除方法

系统.NullReferenceException
H结果=0x80004003
消息=未将对象引用设置为对象的实例。
来源=Microsoft.EntityFrameworkCore
堆栈跟踪:
在 Microsoft.EntityFrameworkCore.Internal.EntityFinder`1.ValidateKeyPropertiesAndExtractCancellationToken(对象[] keyValues、布尔异步、CancellationToken(取消令牌)
在 Microsoft.EntityFrameworkCore.Internal.EntityFinder`1.Find(对象[] 键值)
位于 E:\Programming\Folder\SoqRepository\BL\Repositories\BaseRepository.cs 中的 BL.Repositories.BaseRepository`1.GetById(Nullable`1 id):第 51 行

我尝试过的:

来自数据库的类

C#
using System;
using System.Collections.Generic;

namespace Sq.Models;

public partial class VwItem
{
    public string ItemName { get; set; } = null!;
    public decimal PurchasePrice { get; set; }
    public decimal SalesPrice { get; set; }
    public int CategoryId { get; set; }
    public string? ImageName { get; set; }
    public DateTime CreatedDate { get; set; }
    public string CreatedBy { get; set; } = null!;
    public int CurrentState { get; set; }
    public string? UpdatedBy { get; set; }
    public DateTime? UpdatedDate { get; set; }
    public string? Description { get; set; }
    public string? Gpu { get; set; }
    public string? HardDisk { get; set; }
    public int? ItemTypeId { get; set; }
    public string? Processor { get; set; }
    public int? RamSize { get; set; }
    public string? ScreenReslution { get; set; }
    public string? ScreenSize { get; set; }
    public string? Weight { get; set; }
    public int? OsId { get; set; }
    public string CategoryName { get; set; } = null!;
    public string ItemTypeName { get; set; } = null!;
    public string OsName { get; set; } = null!;
    public int ItemId { get; set; }
}

类接口

C#
using Sq.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Domain.Interfaces
{
    public interface IBaseRepository <t> where T : class
    {
        public IEnumerable<t>GetAll();
        public IEnumerable<t> GetAll(Func<t, bool=""> Condition);
        public T GetById(int? id);
        public void Delete(T Entity);
        public void ChangeState(int id);
    }
}

C#
using Domain.Interfaces;
using Sq.BL;
using Sq.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BL.Repositories
{
    public class BaseRepository<t> : IBaseRepository<t> where T : class
    {
        public LapShopContext LapShopContext;
        public BaseRepository(LapShopContext _LapShopContext)
        {
            LapShopContext = _LapShopContext ?? throw new ArgumentNullException(nameof(_LapShopContext));
        }

实现接口

C#
using Sq.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Domain.Interfaces
{
    public interface IBaseRepository <t> where T : class
    {
        public T GetById(int? id);
        public void Delete(T Entity);
    }
}
        public T GetById(int? id)
        {
            try
            {
                return LapShopContext.Set<t>().Find(id);
            }
            catch (Exception)
            {
                return null;
            }
        }

        public void Delete(T entity)
        {
            try
            {
                LapShopContext.Set<t>().Remove(entity);
                LapShopContext.SaveChanges();
            }
            catch (Exception)
            {
             return;
            }
        }

控制器

C#
public ActionResult Delete(int ItemId)
{
    if (ItemId == null)
    {

        return BadRequest("ItemId is null");
    }

    var Obj = baseRepository.GetById(ItemId);
    baseRepository.Delete(Obj);

    return RedirectToAction("List");
}

解决方案1

正如错误消息所示,问题出在删除方法中。 Delete 方法尝试使用 LapShopContext.Set().Remove(entity) 从上下文中删除实体。 但是,您遇到的错误是 NullReferenceException,这表明实体参数为 null。 出现此问题的原因可能是,当未找到指定的 ID 时,GetById 方法返回 null,并且您在调用 Delete 之前没有检查 null。 您可以修改控制器代码如下:

C#
public ActionResult Delete(int ItemId)
{
    if (ItemId == 0)
    {
        return BadRequest("ItemId is invalid");
    }
    var Obj = baseRepository.GetById(ItemId);
    if (Obj == null)
    {
        return NotFound($"Item with ID {ItemId} not found");
    }
    baseRepository.Delete(Obj);
    return RedirectToAction("List");
}

コメント

タイトルとURLをコピーしました