.net5 core Razor 进阶之二:EF Core基本数据操作介绍(2个表关联)

本篇介绍如何一次操作2个表,还是以 T_Student  和  T_Score 表为例。

场景一:如果客户端的页面是这样的,即提交的时候同时将学生信息和成绩信息提交过来,如下:

这时需要先写入学生表,然后再写入成绩表,新增操作的代码如下(使用事务):

复制代码
public void OnPost()
{
    //如果执行失败事务会自动回收,所以不需要显示执行 trans.Rollback();
    using (IDbContextTransaction trans = _context.Database.BeginTransaction())//开启事务
    {
        TStudent student = new TStudent
        {
            StuName = "雪宝",
            ClassCode = "4-1",
            ClassName = "四(1)班"
        };
        _context.TStudents.Add(student);//新增学生
        _context.SaveChanges(); //保存学生

        TScore score = new TScore
        {
            ScoreId = 4,//为了演示,这里写死
            StuId = student.StuId, //这里已经可以取到刚新增的学生编号
            StuName = student.StuName,
            SubjectCode = "YUWEN",
            SubjectName = "语文",
            ExamScores = 86,
            ExamDate = DateTime.Now
        };
        _context.TScores.Add(score);//新增成绩
        _context.SaveChanges(); //保存成绩

        trans.Commit(); //提交事务
    }
}
复制代码

编译后执行,数据库值如下:

场景二:我们将场景一再演化一下,一次新增某个学生两科(语文、数学)成绩,画面如下:

提交的时候先保存学生表,然后将语文/数学成绩批量保存到成绩表,代码如下:

复制代码
public void OnPost()
{
    //如果执行失败事务会自动回收,所以不需要显示执行 trans.Rollback();
    using (IDbContextTransaction trans = _context.Database.BeginTransaction())//开启事务
    {
        TStudent student = new TStudent
        {
            StuName = "王子嘉",
            ClassCode = "4-1",
            ClassName = "四(1)班"
        };

        _context.TStudents.Add(student);
        _context.SaveChanges(); //保存

        TScore ywScore = new TScore
        {
            ScoreId = 5,
            StuId = student.StuId,
            StuName = student.StuName,
            SubjectCode = "YUWEN",
            SubjectName = "语文",
            ExamScores = 89,
            ExamDate = DateTime.Now
        };
        TScore sxScore = new TScore
        {
            ScoreId = 6,
            StuId = student.StuId,
            StuName = student.StuName,
            SubjectCode = "SHUXUE",
            SubjectName = "数学",
            ExamScores = 97,
            ExamDate = DateTime.Now
        };
        List<TScore> scoreList = new List<TScore>();
        scoreList.Add(ywScore);
        scoreList.Add(sxScore);
        _context.TScores.AddRange(scoreList);//使用 AddRange() 批量新增,传入实体 List.
        _context.SaveChanges(); //保存

        trans.Commit(); //提交事务
    }
}
复制代码

编译后执行,结果如下:

场景三、直接执行SQL语句。

在某种情况下,如果使用EFCore框架提供的方法无法完成想要的效果,那就只能使出终极杀招了,方法如下:

public void OnGet()
{
    _context.Database.ExecuteSqlRaw("UPDATE t_student SET class_name={0} WHERE stu_id={1}", "五(1)班", 1);
}

调用 ExecuteSqlRaw() 方法去执行SQL, 编译后运行,效果如下:

执行前的数据:

执行后的数据:

 

posted @   屏风马  阅读(416)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示