首先,由于开发人员的跳槽,我采用了一个项目,所以这不仅是我对.net core的第一次体验,而且我必须消化一个我没有编写的大型代码库。
我需要知道在哪里解决问题。我有一个视图,该视图在表中呈现记录列表。
以下是相关的访问类:
[Table("AccountDetails")]
public class AccountDetail
{
public int Id { get; set; }
public ICollection<FileUpload> Files { get; set; }
}
该问题发生在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; }
}
以下是返回此列表的方法:
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
扩展了IdentityUser
。 UploadedBy
是映射到ApplicationUser的问题。
具有管理员角色,它永远不会失败,并且可以正确映射到ApplicationUser
,因此CreatedBy
永远不会null
。
但是,在不是管理员角色的其他用户帐户下,该用户未创建的任何内容都将返回null,这将触发对象引用错误。
现在,我知道该问题应该得到快速响应,例如,“嘿,显然用户没有正确的权限。”但是我需要知道在哪里寻求解决的帮助。
在这种情况下,CreatedBy
永远不要返回null
。
请让我知道我应该在问题中添加哪些进一步的详细信息以帮助对此进行跟踪。我不知道这种自动映射在哪里或如何发生。
我在快照中发现了这个
modelBuilder.Entity("Accounting.Entities.FileUpload", b =>
{
b.HasOne("Accounting.Entities.ApplicationUser", "CreatedBy")
.WithMany()
.HasForeignKey("CreatedById");
});
CreatedById
是实际表中引用AspNetUsers
的列。
如果我一直回到被称为控制器的构造函数:
public FormAccountsController(ApplicationDbContext context,
UserManager<ApplicationUser> userManager,
IMapper mapper,
RoleManager<IdentityRole> roleManager) : base(context, userManager, roleManager, mapper)
{
}
我在ApplicationDbContext context
中查看,我可以看到FileUploads
,对于不是由该特定用户创建的记录,CreatedBy为空,但是从现在开始,我不确定在哪里查找。同样,如果我使用管理员帐户登录,则CreatedBy
永远不会为空。
答案 0 :(得分:0)
感谢@TanvirArjel对原始问题的评论,我能够按照跟踪进行操作并找到问题所在。这是表单工厂中的include
逻辑。
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);
}