Nous obtenons l'exception de référence null classique, "Référence d'objet non définie sur une instance d'un objet." Rien d'inhabituel ici, sauf qu'il se passe sur un IdentityUser qui vient directement du contexte.Inconsistenty "Référence d'objet non définie sur une instance d'un objet" sur la clé primaire de AspNetUsers
La ligne de déclenchement est l'exception:
allUsers.FirstOrDefault(u => u.Id == log.ActionByUserId)
et l'exception est déclenchée à u.Id. Comment pourriez-vous jamais être nul dans ce scénario? Cela me suggère que l'une des entrées dans allUsers est null, mais je ne comprends pas comment cela se produirait lorsque allUsers est extrait de la base de données par Entity Framework. Cela se produit sur une action de contrôleur en lecture seule, donc nous n'avons pas essayé de créer un utilisateur plus tôt dans la requête.
Cette erreur se produit par intermittence sur notre instance de production, mais ne se produit pas lorsque nous restaurons la même base de données dans un environnement de développement.
code plus pour le contexte (bien que j'ai simplifié ce code aux sections pertinentes aussi):
Contexte (la classe ApplicationUser a son propre contexte, séparé du contexte partagé par la plupart de nos autres entités):
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
service:
public class UserService
{
private readonly ApplicationDbContext _context;
public IEnumerable<ApplicationUser> GetUsers()
{
var contextUsers = _context.Users;
return contextUsers;
}
}
objet domaine
public class ApplicationUser : IdentityUser
{
// Id is inherited from IdentityUser
}
Action de contrôleur:
public ActionResult ParticipantLog(int participantId)
{
var allUsers = UserService.GetUsers();
var log = LogService.GetParticipantLog(participantId);
var model = ParticipantLogsModelMapper.Create(log, allUsers);
}
Mapper:
public static ParticipantLogsViewModel Create(ParticipantLog log, IEnumerable<ApplicationUser> allUsers)
{
var actionBy = allUsers.FirstOrDefault(u => u.Id == log.ActionByUserId);
var model = new ParticipantLogViewModel
{
ActionBy = actionBy.DisplayName
};
return model;
}
Pourquoi vous pouvez être sûr du numéro de ligne, même quelle variable qui est nulle? Êtes-vous capable d'attacher le débogueur au serveur de production? –
@ThariqNugrohotomo C'est une application interne. Nous renvoyons des messages d'erreur complets lorsqu'il existe une exception. – thelem
En supposant que cette ligne est le coupable réel, je soupçonne d'abord les variables 'log' et' allUsers'. Il existe cependant un autre problème possible, par ex. problème de thread-sécurité - depuis le modèle multitâche de Web ASP. –