Внутренняя ошибка исключения: инструкция 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}  
Другие вопросы по тегам