代码之家  ›  专栏  ›  技术社区  ›  user1447679

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

  •  0
  • user1447679  · 技术社区  · 5 年前

    首先,由于开发人员跳槽,我采用了一个项目,因此这不仅是我第一次使用.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

    有了管理员角色,它就不会失败,并且会正确地映射到 应用程序用户 所以 CreatedBy null

    但是,在非管理员角色的其他用户帐户下,非该用户创建的任何内容都将返回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 创造的 永远不为空。

    1 回复  |  直到 5 年前
        1
  •  0
  •   user1447679    5 年前

    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);
    
    
            }