ASP.NET如何获取刚新增的记录ID并作为外键添加到另一表记录中
解决方案
以下是ASP.NET框架下两种常见场景的实现方法:
场景1:同一表单一次性提交监护人+学生信息(推荐)
这种场景不需要用户手动跳转页面,直接一次提交两类信息,依靠EF Core的自动关联或者手动取值完成外键赋值。
若使用EF Core
第一步:配置实体导航属性
// 监护人实体 public class Guardian { public int Id { get; set; } public string Name { get; set; } public string ContactPhone { get; set; } // 导航属性:关联的学生列表 public ICollection<Student> Students { get; set; } = new List<Student>(); } // 学生实体 public class Student { public int Id { get; set; } public string Name { get; set; } public DateTime BirthDate { get; set; } // 外键:监护人ID public int GuardianId { get; set; } // 导航属性:关联的监护人 public Guardian Guardian { get; set; } }
第二步:提交时自动关联(无需手动取ID)
[HttpPost] public IActionResult SubmitForm(Guardian guardianInfo, Student studentInfo) { if (ModelState.IsValid) { // 直接将学生对象加入监护人的导航属性 guardianInfo.Students.Add(studentInfo); _context.Guardians.Add(guardianInfo); // 保存时EF会自动为学生对象的GuardianId赋值刚生成的监护人自增ID _context.SaveChanges(); return RedirectToAction("Success"); } return View(); }
如果不需要配置导航属性,也可以手动取值赋值:
[HttpPost] public IActionResult SubmitForm(Guardian guardianInfo, Student studentInfo) { if (ModelState.IsValid) { _context.Guardians.Add(guardianInfo); // 保存后guardianInfo.Id已经是数据库生成的最新ID _context.SaveChanges(); // 手动赋值外键 studentInfo.GuardianId = guardianInfo.Id; _context.Students.Add(studentInfo); _context.SaveChanges(); return RedirectToAction("Success"); } return View(); }
若使用原生ADO.NET
插入监护人记录后执行SELECT SCOPE_IDENTITY()即可拿到最新生成的自增ID:
using (var conn = new SqlConnection("你的数据库连接字符串")) { conn.Open(); // 插入监护人并返回新ID var insertGuardianCmd = new SqlCommand( "INSERT INTO Guardians (Name, ContactPhone) VALUES (@Name, @Phone); SELECT SCOPE_IDENTITY()", conn); insertGuardianCmd.Parameters.AddWithValue("@Name", guardianInfo.Name); insertGuardianCmd.Parameters.AddWithValue("@Phone", guardianInfo.ContactPhone); int newGuardianId = Convert.ToInt32(insertGuardianCmd.ExecuteScalar()); // 插入学生信息 var insertStudentCmd = new SqlCommand( "INSERT INTO Students (Name, BirthDate, GuardianId) VALUES (@Name, @Birth, @GId)", conn); insertStudentCmd.Parameters.AddWithValue("@Name", studentInfo.Name); insertStudentCmd.Parameters.AddWithValue("@Birth", studentInfo.BirthDate); insertStudentCmd.Parameters.AddWithValue("@GId", newGuardianId); insertStudentCmd.ExecuteNonQuery(); }
场景2:分步提交(先填监护人信息,跳转后再填学生信息)
这种场景需要把生成的监护人ID临时存储,带到学生表单页:
监护人信息提交成功后存储ID
[HttpPost] public IActionResult SubmitGuardian(Guardian guardianInfo) { if (ModelState.IsValid) { _context.Guardians.Add(guardianInfo); _context.SaveChanges(); // 临时存储新ID,可选择TempData、Session、路由参数任意一种 TempData["NewGuardianId"] = guardianInfo.Id; // 跳转到学生信息填写页 return RedirectToAction("AddStudent"); } return View(guardianInfo); }
学生表单页加载时赋值外键
在Action中读取存储的ID:
public IActionResult AddStudent() { var student = new Student(); if (TempData["NewGuardianId"] is int guardianId) { student.GuardianId = guardianId; } return View(student); }
在Razor视图中添加隐藏域携带外键值,提交时会自动绑定到学生实体的GuardianId属性:
<input type="hidden" asp-for="GuardianId" />
内容的提问来源于stack exchange,提问作者Amkelekile Nkelie
相关产品推荐
相关产品推荐

