Внутренняя ошибка исключения: инструкция INSERT конфликтует с ограничением FOREIGN KEY
Я пытаюсь добавить Id таблицы билетов в другую таблицу (TrackTicket) и вставить его в поле (TicketId), и я получил эту ошибку
Ошибка: исключение типа "System.Data.Entity.Infrastructure.DbUpdateException" возникло в EntityFramework.dll, но не было обработано в коде пользователя
- Внутренняя ошибка исключения: оператор вставки конфликтовал с ограничением внешнего ключа \"FK_dbo.TrackTickets_dbo.Tickets_TicketId\". Конфликт произошел в базе данных \ "databasename" \", таблице \"dbo.Tickets"\, столбце" Id ". \ Оператор был прерван
Что это значит? Помогите!
Код
контроллер
_context.Tickets.Add(new Ticket {ClientId = userId , Subject = viewModel.Ticket.Subject, TypeOfTicket = viewModel.Ticket.TypeOfTicket, ConcernedDept = viewModel.Ticket.ConcernedDept, Date = DateTime.Now});
_context.TicketContents.Add(new TicketContent {Subject = viewModel.Ticket.Subject, Content = viewModel.TicketContent.Content});
_context.TrackTickets.Add(new TrackTicket { ClientId = userId,TicketId = viewModel.Ticket.Id ,StatusHelpDesk = "Received", DateHelpDeskReceived = DateTime.Now });
_context.SaveChanges();
1 ответ
Я не знаю вашу схему полностью, но вы создаете или вставляете новый тикет, а также создаете или вставляете трек-тикет со ссылкой на тикет, пока вы не установили или не получили идентификатор тикета.
Эта строка еще не имеет идентификатора. Либо установите здесь идентификатор, либо создайте переменную Ticket и используйте этот идентификатор для ссылки на TrackTickets. _context.Tickets.Add(new Ticket {ClientI d = userI d, Subject = viewModel.Ticket.Subject, TypeOfTicket = viewModel.Ticket.TypeOfTicket, ConcernedDept = viewModel.Ticket.ConcernedDept, Date = DateTime.Now});
Добавление завершится неудачно, так как TicketI d не может быть связан с чем-либо (тикет с таким I d не был вставлен.
_context.TrackTickets.Add(new TrackTicket { ClientId = userId, TicketId = viewModel.Ticket.Id, StatusHelpDesk = "Received", DateHelpDeskReceived = DateTime.Now });
Способ, которым вы можете использовать это, если вы автоматически генерируете ticketId, выглядит следующим образом:
var newTicket = new Ticket {ClientId = userId, Subject = viewModel.Ticket.Subject, TypeOfTicket = viewModel.Ticket.TypeOfTicket, ConcernedDept = viewModel.Ticket.ConcernedDept, Date = DateTime.Now}
_context.Tickets.Add(newTicket);
_context.SaveChanges();
Если вы теперь повторно используете объект newTicket, у него будет идентификатор. Так что в добавлении для trackTickets, используйте идентификатор нового билета
_context.TrackTickets.Add(new TrackTicket { ClientId = userId, TicketId = newTicket.Id, StatusHelpDesk = "Received", DateHelpDeskReceived = DateTime.Now });
Если вы не генерируете свой идентификатор тикета автоматически, вы должны установить его при создании тикета (добавить в контекст):
var newTicket = new Ticket { Id = viewModel.Ticket.Id, ClientId = userId, Subject = viewModel.Ticket.Subject, TypeOfTicket = viewModel.Ticket.TypeOfTicket, ConcernedDept = viewModel.Ticket.ConcernedDept, Date = DateTime.Now}