繁体   English   中英

SqlException:INSERT语句与FOREIGN KEY约束冲突

[英]SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint

您好,谢谢您抽出宝贵时间阅读这篇文章。 我是EF Core的新手,我正在尝试建立以下数据库连接,在这些数据库连接中有来自模型的脚手架控制器。

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语句与FOREIGN KEY约束“ 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控制器内。

这看起来更像是一个绑定问题。 首先,您所包含字段的白名单中没有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的视图上具有输入字段或隐藏字段,否则它将返回null

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

尝试在QuestionObject上填充GroupItem对象,以帮助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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM