繁体   English   中英

ApplicationUser上的ASP.net Core 1.0映射属性返回null

[英]ASP.net Core 1.0 Mapping property on ApplicationUser returning null

首先,由于开发人员的跳槽,我采用了一个项目,所以这不仅是我对.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为null,但是从现在开始,我不确定在哪里查找。 再一次,如果我使用管理员帐户登录,则CreatedBy永远不会为null。

感谢@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);


        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM