您好,并提前感谢您花时间阅读这篇文章。我是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控制器中。
答案 0 :(得分: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设置输入字段或隐藏字段,否则它将返回null
@Html.HiddenFor(m => m.GroupItemID)
答案 1 :(得分:0)
尝试在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);
}