SqlException:INSERT文がFOREIGN KEY制約と競合しました

asp.net-mvc c# ef-code-first entity-framework-core

質問

こんにちは、そしてこの記事を読むのに時間をかけてくれてありがとうございます。私は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ステートメントは、外部キー制約 "FK_QuestionObject_GroupItem_GroupItemID"と競合しました。データベース "aspnet-VotingWebApp-02945df4-961a-4b8f-8999-19aa61dfd02e"、テーブル "dbo.GroupItem"、列 'GroupItemID'で競合が発生しました。

どうすればこの対立を解決することができるのかわかりません。私は他の記事を読みましたが、それらは主にその人が既存のキーを供給していないことを強調しています。私はEFコアに不慣れですので、どんな助けでも評価されるでしょう。

    // 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)

人気のある回答

EFがFKの関係を理解するのに役立つように、QuestionObjectにGroupItemオブジェクトを追加してみてください。

[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);
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ