System.nullreferenceexception dans le modèle de référentiel

la programmation


dans le modèle de référentiel System.NullReferenceException
Supprimer la méthode

System.NullReferenceException
HRésult=0x80004003
Message=Référence d’objet non définie sur une instance d’un objet.
Source = Microsoft.EntityFrameworkCore
Trace de la pile:
sur Microsoft.EntityFrameworkCore.Internal.EntityFinder`1.ValidateKeyPropertiesAndExtractCancellationToken(Object[] keyValues, Boolean async, CancellationToken (annulationToken)
sur Microsoft.EntityFrameworkCore.Internal.EntityFinder`1.Find(Object[] valeurs-clés)
à BL.Repositories.BaseRepository`1.GetById (Nullable`1 id) dans E:\Programming\Folder\SoqRepository\BL\Repositories\BaseRepository.cs:line 51

Ce que j’ai essayé :

Classe de la base de données

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

Interface de classe

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

implémenter l’interface

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

Manette

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

Solution 1

Comme message d’erreur, le problème réside dans la méthode Supprimer. La méthode Supprimer tente de supprimer une entité du contexte à l’aide de LapShopContext.Set().Remove(entity). Cependant, l’erreur que vous rencontrez est une NullReferenceException, qui suggère que le paramètre d’entité est nul. Le problème peut se produire car la méthode GetById renvoie null lorsque l’identifiant spécifié n’est pas trouvé et que vous ne recherchez pas null avant d’appeler Supprimer. vous pouvez modifier le code du contrôleur comme ci-dessous :

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をコピーしました