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 ).