2017-02-10 6 views
0

Здравствуйте и заблаговременно за то, что вы нашли время, чтобы прочитать это сообщение. Я новичок в EF Core, и я пытаюсь настроить следующее соединение с базой данных, где у меня есть подсистемные контроллеры из моделей.SqlException: инструкция INSERT противоречила ограничениям FOREIGN KEY

namespace VotingWebApp.Models 
{ 
    public class QuestionObject 
    { 
    public int QuestionObjectID { get; set; } 
    public string Question { get; set; } 
    public string AnswerA { get; set; } 
    public string AnswerB { get; set; } 
    public int AnswerAVote { get; set; } 
    public int AnswerBVote { get; set; } 
    public int GroupItemID { get; set; } 
    public ICollection<ResponseItem> ResponseItems { get; set; } 
    public GroupItem GroupItem { get; set; } 
    } 
} 


namespace VotingWebApp.Models 
{ 
    public class GroupItem 
    { 
     public int GroupItemID { get; set; } 
     public string GroupName { get; set; } 
     public int MemberCount { get; set; } 
     public int Host { get; set; } 
     public ICollection<GroupUserLink> GroupUserLinks { get; set; } 
     public ICollection<QuestionObject> QuestionItems { get; set; } 
    } 
} 

я получаю следующее сообщение об ошибке при попытке создать новый QuestionObject в базе данных (Даже когда я поставить существующий ключ GroupItem).

SqlException: Инструкция INSERT заявление противоречит ограничение внешнего ключа "FK_QuestionObject_GroupItem_GroupItemID". Конфликт произошел в базе данных «aspnet-VotingWebApp-02945df4-961a-4b8f-8999-19aa61dfd02e», таблица «dbo.GroupItem», столбец «GroupItemID».

Я не уверен, как решить этот конфликт. Я прочитал другие сообщения, и они в основном показывают, как человек не снабжает существующий ключ. Я новичок в EF Core, поэтому любая помощь будет оценена.

// GET: QuestionObjects/Create 
    public async Task<IActionResult> CreateQuestion(int? id) 
    { 
     if (id == null) 
     { 
      return NotFound(); 
     } 

     var groupItem = await _context.GroupItem.SingleOrDefaultAsync(m => m.GroupItemID == id); 
     if (groupItem == null) 
     { 
      return NotFound(); 
     } 
     QuestionObject questionObject = new QuestionObject(); 
     questionObject.GroupItemID = groupItem.GroupItemID; 
     return View(questionObject); 
    } 

    // POST: QuestionObjects/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> CreateQuestion([Bind("AnswerA,AnswerAVote,AnswerB,AnswerBVote,GroupID,Question")] QuestionObject questionObject) 
    { 
     if (ModelState.IsValid) 
     { 
      _context.Add(questionObject); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 
     return View(questionObject); 
    } 

Я добавил код для ввода. Это находится в контроллере GroupItem.

+0

Показать код вставки. –

+0

Ответ, вероятно, заключается в том, как вы поставляете существующий ключ GroupItem. Как вы это делаете? –

+0

Попробуйте '_context.QuestionObjects.Add (questionObject);' –

ответ

1

Это больше похоже на проблему привязки. Во-первых, ваш белый список включенных полей не GroupItemID так добавить его (если GroupID не опечатка):

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> CreateQuestion([Bind(Include="AnswerA,AnswerAVote,AnswerB,AnswerBVote,GroupID,GroupItemID,Question")] QuestionObject questionObject) 
{ 
    if (ModelState.IsValid) 
    { 
     _context.QuestionObjects.Add(questionObject); 
     await _context.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 
    return View(questionObject); 
} 

Далее, вам необходимо либо иметь поле ввода или скрытое поле на ваш взгляд, для GroupItemID или него вернется

@Html.HiddenFor(m => m.GroupItemID) 
+0

Спасибо, Стив это решение работает отлично. – Calst

0

Попробуйте заполнить объект GroupItem в QuestionObject, чтобы помочь EF понять отношения FK.

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> CreateQuestion([Bind("AnswerA,AnswerAVote,AnswerB,AnswerBVote,GroupID,Question")] QuestionObject questionObject) 
{ 
    if (ModelState.IsValid) 
    { 
     questionObject.GroupItem = _context.GroupItem.Single(m => m.GroupItemID == questionObject.GroupItemID) 
     _context.Add(questionObject); 
     await _context.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 
    return View(questionObject); 
} 
+0

Не обязательно. Вы можете сделать это с выставленным FK: http://stackoverflow.com/questions/13148585/entity-framework-add-child-entity –

+0

Согласовано. Он должен работать с выставленным FK. Но Калст предположил, что разоблаченный FK не работает для него, поэтому в его случае нахождение объекта GroupItem является единственным обходным решением. –

+0

Скорее всего, проблема привязки, когда GroupItemID возвращается null (0). Отладка проверит это. Для списка привязок требуется добавление GroupItemID, и для просмотра требуется входное или скрытое поле. –