Свойство ASP.net Core 1.0 Mapping для ApplicationUser, возвращающего ноль - PullRequest
0 голосов
/ 25 января 2019

Во-первых, я принял проект из-за прыжка с корабля разработчиков, так что это не только мой первый опыт работы с ядром .net, но я должен переварить большую кодовую базу, которую я не писал.

Мне нужно знать, где искать решение проблемы. У меня есть представление, которое отображает в таблице список записей.

Вот соответствующие классы, к которым обращались:

[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 никогда не будет нулевым.

1 Ответ

0 голосов
/ 28 января 2019

Спасибо @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);


        }
...