0
votes

Récupérer un objet Nullable à l'aide d'EF CORE

Je suis un débutant et en testant du code, je n'arrive pas à comprendre comment le faire correctement.

1er: J'ai une classe City:

var result = await _context.Contact
            .Where(w => w.Id == id)
            .Include(q => q.City)
            .Select(s => new Contact
            {
                // Entity
                Id = s.Id,
                // Model
                Line1 = s.Line1,
                Line2 = s.Line2,
                CityId = s.CityId,
                City = new City // I am retrieving this so that I can get the inner data as well
                {
                    // Entity
                    Id = s.City.Id,
                    // Model
                    ZipCode = s.City.ZipCode,
                    Name = s.City.Name,
                }
            }).FirstOrDefaultAsync();

2ème: J'ai une classe Contact qui utilise une classe City nullable ( au cas où l'utilisateur ne connaît pas la ville ):

public class Contact
{
    public Contact()
    {
        Name = "";
        Line1 = "";
        Line2 = "";
        CityId = null;
        City = new City();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }

    private int? _CityId;
    public int? CityId
    {
        get { return _CityId; }
        set { _CityId = value < 1 ? null : value; }
    }

    private City _City;
    public City City
    {
        get { return _City; }
        set { _City = _CityId == null ? null : value; }
    }
}

Le problème que je rencontre est lorsque je récupère un enregistrement qui a stocké une ville nulle ( lors de la récupération d'un enregistrement et sa ville n'est pas nulle, tout fonctionnera bien ). Ma déclaration .Select () ressemble à ceci:

public class City
{
    public City()
    {
        ZipCode = "";
        Name = "";
    }

    public int Id { get; set; }
    public string ZipCode { get; set; }
    public string Name { get; set; }
}

La sortie est correcte pour les enregistrements qui n'ont pas de ville nulle, mais si l'utilisateur récupère un enregistrement avec une ville nulle, il renvoie l'erreur suivante :

L'objet Nullable doit avoir une valeur.

Quelqu'un peut-il m'apprendre comment faire cela correctement? Merci d'avance!


0 commentaires

3 Réponses :


1
votes

Vous n'avez pas besoin de créer une nouvelle entité à l'aide de Select, vous obtenez l'erreur car si s.City est nul, s.City.Id n'existe pas. Insteat le rechercher directement en utilisant

var result = await _context.Contact
            .Include(q => q.City)
            .FirstOrDefaultAsync(x => x.Id == id);


0 commentaires

2
votes

Pourquoi utiliser Select et utiliser la propriété privée pour la ville ?

Classe de contact:

var result = await _context.Contact
            .Include(q => q.City)
            .FirstOrDefaultAsync(f => f.Id == id);

Votre Select est identique à la classe d'entité et vous n'avez pas besoin de l'utiliser.

public class Contact
{
    public Contact()
    {
        Name = "";
        Line1 = "";
        Line2 = "";
        CityId = null;
        City = new City();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }

    public int? CityId;
    public City City
    
}


0 commentaires

0
votes

Merci pour les réponses à tous!

J'ai trouvé que le coupable est cette ligne de code ( grâce à vos réponses et explications ):

Id = s.City.Id

C'est parce que Id ici est un int ( non nullable puisqu'il s'agit d'une identité dans MSSQL ) mais lorsque CityId ( et aussi l'objet City ) stocke un null dans la base de données, s.City.Id contiendra également null dans le .Select () .

Le Id = s.City.Id dans le cas ci-dessus échoue car Id ( non nullable ) est forcé de recevoir un null ( contenu dans le s.City.Id ).


0 commentaires