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!
3 Réponses :
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);
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 }
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 ).