#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
и в конечном итоге сканируете всю таблицу