You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:15:02