Внутренняя ошибка исключения: инструкция INSERT конфликтует с ограничением FOREIGN KEY - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь добавить 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 Ответ

0 голосов
/ 14 января 2019

Я не знаю вашу схему полностью, но вы создаете или вставляете новый билет, а также создаете или вставляете трек-билет со ссылкой на билет, пока вы не установили или не получили идентификатор билета.

У этой строки еще нет идентификатора. Либо установите здесь идентификатор, либо создайте переменную Ticket и используйте этот идентификатор для ссылки на TrackTickets. _context.Tickets.Add (new Ticket {ClientId = userId, Subject = viewModel.Ticket.Subject, TypeOfTicket = viewModel.Ticket.TypeOfTicket, ConcernedDept = viewModel.Ticket.ConcernedDept, Date = DateTime.Now});

Добавление не будет выполнено, так как TicketId не может быть связан с чем-либо (тикет с таким Id не был вставлен.

_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 используйте идентификатор newTicket

_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}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...