Не удается получить доступ к данным постороннего ключа applicationUser, «ICollection» не содержит определения «Сообщение» - PullRequest
0 голосов
/ 12 ноября 2019

Попытка добавить / отредактировать свойства связанных данных applicationUser, чтобы можно было записывать заметки для пользователей

ApplicationUser.cs

 public class ApplicationUser : IdentityUser
{

    public virtual ICollection<UserNote> UserNotes { get; set; }
    [Required]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
    [Required]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
}

UserNote.cs

    public class UserNote
{
    [Key]
    public int UserNoteId { get; set; }
    public string Message { get; set; }
    public string ApplicationUserID { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

Контроллер

    [HttpPost, ActionName("Edit")]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> EditPost(string id, ApplicationUser applicationUser)
    {

        if (ModelState.IsValid)
        {
            var userFromDb = _db.ApplicationUser
                .Include(n => n.UserNotes)
                .Include(r => r.UserRoles)
                .AsNoTracking().FirstOrDefault(m => m.Id == id);
            UserNote note = _db.UserNote.Single(x => x.UserNoteId == 1);

            userFromDb.LastName = applicationUser.LastName;
            userFromDb.FirstName = applicationUser.FirstName;

            //Error accessing related data properties


            userFromDb.UserNotes.Message = applicationUser.UserNotes.Message;
            await _db.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(applicationUser);
    }

Я получил 'ICollection', не содержит определения для 'Message' и нет доступного метода расширения 'Message', принимающего первый аргумент типа 'ICollection'

Ответы [ 2 ]

0 голосов
/ 13 ноября 2019

Попробуйте отредактировать соответствующие свойства данных applicationUser следующим образом:

    [HttpPost, ActionName("Edit")]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> EditPost(string id, ApplicationUser applicationUser)
    {

        if (ModelState.IsValid)
        {
            var userFromDb = _context.ApplicationUser
                .Include(n => n.UserNotes)
                .AsNoTracking().FirstOrDefault(m => m.Id == id);
            //UserNote note = _context.UserNote.Single(x => x.UserNoteId == 1);

            userFromDb.LastName = applicationUser.LastName;
            userFromDb.FirstName = applicationUser.FirstName;

            foreach (var usernote in applicationUser.UserNotes.ToList())
            {
                if (userFromDb.UserNotes.Any(un => un.UserNoteId == usernote.UserNoteId))
                {
                    userFromDb.UserNotes.Find(un => un.UserNoteId == usernote.UserNoteId).Message = usernote.Message;
                }
            }

            _context.Update(userFromDb);

            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(applicationUser);
    }
0 голосов
/ 12 ноября 2019

UserNotes - это коллекция, поэтому вам необходимо получить доступ к определенному индексу перед тем, как получить его свойство Message.

// Use .Count to check if the list contains any number.

if(applicationUser.UserNotes.Count != 0){

   // .FirstOrDefault() will return the first object in that list, if there is none, it would return null.

   userFromDb.UserNotes.FirstOrDefault().Message = applicationUser.UserNotes.FirstOrDefault().Message;

}else{
   // this is just to let you know if it's empty just in case if you don't debug

   return Content("Your collection is empty.");
}

Вы также можете использовать .IndexOf () или .Where () со своим списком, если вы ищете конкретную запись.

Мне не совсем понятно, что вы пытаетесь: добавляете ли вы новую заметку или редактируете существующую заметку. Дайте мне знать в комментариях, если это не работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...