SaveChangesAsync не сохраняет определенное значение при его назначении

#c# #sql-server #database #entity-framework-core #guid

#c# #sql-сервер #База данных #сущность-структура-ядро #guid

Вопрос:

Я столкнулся с проблемой, которую, кажется, не совсем понимаю. Здесь у меня есть элемент билета, который назначен пользователю. Я реализовал функцию, позволяющую изменять пользователя. Пользователь изменен и обновлен правильно, однако UserID значение билета остается неизменным, несмотря на переназначение и SaveChangesAsync вызов для подтверждения этих изменений. .AssignedUser изменяется в базе данных и сохраняется, однако UserID отказывается обновляться в БД. Ни одно из значений не является нулевым, и при установке точки останова и выполнении функции все, кажется, правильно присваивается правильным значениям. Значение UserID просто не сохраняется и не обновляется. Был бы признателен за любое понимание этого. Заранее спасибо

Модель билета

 public class Ticket {  [Key]  public Guid Id { get; set; }    [Required]  public string Title { get; set; }   public Guid UserID { get; set; } //who the ticket is assigned to   public Guid CreatedByUser { get; set; } //who this ticket is created by   public ApplicationUser CreatedBy { get; set; } //created by user    public ApplicationUser AssignedUser { get; set; } // who the ticket is assigned to  }  

Страница бритвы

 [Parameter] public Guid Id { get; set; } private Ticket ticketItem { get; set; } = new Ticket(); private ApplicationUser AssignUser { get; set; } = new ApplicationUser();  private async Task ChangeUser() {  try {  var response = await Http.PutAsJsonAsync($"Tickets/changeuser/{AssignUser.UserName}/{ticketItem.Id}", AssignUser);  } catch(Exception) { ... }  }  

Контроллер, вносящий изменения

 [HttpPut("changeuser/{username}/{ticketID}")]  public async Tasklt;IActionResultgt; ChangeTicketUser(string username, Guid ticketID)  {  ApplicationUser findUser;  Ticket ticketItem;  try {  findUser = await _userManager.Users.FirstAsync(u =gt; u.Email.Equals(username));    } catch (Exception)  {  return Forbid(); //user not found  }   try  {  ticketItem = await _context.Tickets.Where(t =gt; t.Id.ToString().Equals(ticketID.ToString())).FirstAsync();  } catch (Exception)  {  return BadRequest(); //ticket not found  }    ticketItem.AssignedUser = findUser;  ticketItem.UserID = Guid.Parse(findUser.Id);   await _context.SaveChangesAsync();   return NoContent();   }  

Значения различны и допустимы

введите описание изображения здесь

Запрошенная модель пользователя приложения

 public class ApplicationUser : IdentityUser {  public string firstName { get; set; }   public string lastName { get; set; }   public DateTime LastAccessed { get; set; } }  

Комментарии:

1. Зачем вам нужно «анализировать» значение идентификатора пользователя, которое буквально является другим идентификатором пользователя? Они должны быть одного и того же типа данных, не так ли?

2. Почему бы вам просто не сравнить поля? _contedt.Tickets.Where(t=gt;t.Id==ticketID) . И если Id это ключ, вы можете использовать var ticketItem=_context.Tickets.Find(ticketId);

3. Идентификатор использует строковый тип, в то время как я решил использовать идентификатор Guid

4. В любом случае, что со всеми этими «toString»? Идентификатор Guid можно сравнить с другим идентификатором Guid, используя == как обычно.

5. Это не объясняет, почему вы используете ToString() повсюду. Если Id это не строка, вы фактически отключаете индекс Id и в конечном итоге сканируете всю таблицу