Innanzitutto, ho adottato un progetto a causa di una nave da salto per sviluppatori, quindi non solo questa è la mia prima esperienza con il core .net, ma devo digerire una grande base di codice che non ho scritto.
Devo sapere dove cercare per risolvere un problema. Ho una vista che rende in una tabella un elenco di record.
Ecco le classi pertinenti a cui si accede:
[Table("AccountDetails")]
public class AccountDetail
{
public int Id { get; set; }
public ICollection<FileUpload> Files { get; set; }
}
Il problema si verifica nella proprietà Files
.
[Table("FileUploads")]
public class FileUpload
{
public int Id { get; set; }
public string FileName { get; set; }
public ApplicationUser CreatedBy { get; set; }
public string ContentType { get; set; }
public byte[] Content { get; set; }
}
Ecco il metodo che restituisce questo elenco:
var files = _form.AccountDetail.Files.Select(q => new FileModel
{
FileName = q.FileName,
FileId = q.Id,
EffectiveDate = q.CreatedOn.ToString("d"),
FormId = _form.Id,
UploadedBy = $"{ q.CreatedBy.FirstName } { q.CreatedBy.LastName }"
}).ToList();
ApplicationUser
estende IdentityUser
. UploadedBy
è il problema associato a ApplicationUser.
Con un ruolo di amministratore, questo non manca mai ed è associa correttamente al ApplicationUser
modo CreatedBy
non è mai null
.
Tuttavia, con un account utente diverso che non è un ruolo di amministratore, qualsiasi cosa non creata da quell'utente restituisce null, che provoca un errore di riferimento all'oggetto.
Ora so che il problema merita una risposta rapida come "Ehi, ovviamente l'utente non ha le autorizzazioni giuste", ma ho bisogno di assistenza su dove cercare per risolverlo.
In questo caso, CreatedBy
non dovrebbe mai restituire null
.
Non so esattamente dove o come si stia verificando questa mappatura automatica.
Ho trovato questo nell'istantanea:
modelBuilder.Entity("Accounting.Entities.FileUpload", b =>
{
b.HasOne("Accounting.Entities.ApplicationUser", "CreatedBy")
.WithMany()
.HasForeignKey("CreatedById");
});
CreatedById
è la colonna nella tabella effettiva che fa riferimento ad AspNetUsers
.
Se torno al costruttore per il controller chiamato:
public FormAccountsController(ApplicationDbContext context,
UserManager<ApplicationUser> userManager,
IMapper mapper,
RoleManager<IdentityRole> roleManager) : base(context, userManager, roleManager, mapper)
{
}
E guardo nel ApplicationDbContext context
, posso vedere FileUploads
e CreatedBy è nullo per il record che non è stato creato da questo particolare utente, ma da questo punto in poi non sono sicuro dove cercare. E ancora, se CreatedBy
con un account amministratore, CreatedBy
non è mai nullo.
Grazie a @TanvirArjel per il commento alla domanda originale, sono stato in grado di seguire il percorso e trovare il problema. Era nella logica di include
all'interno della fabbrica di moduli.
if (user.AccountProfile != null)
{
form = _context.Forms.Include(q => q.AccountingDetail)
.ThenInclude(q => q.Files)
.ThenInclude(q => q.CreatedBy) // This was missing
.Single(q => q.Id == formId);
}