首页 > 技术文章 > .net5 core Razor 进阶之二:EF Core基本数据操作介绍(2个表关联)

pfm33 2021-05-22 23:26 原文

本篇介绍如何一次操作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, 编译后运行,效果如下:

执行前的数据:

执行后的数据:

 

推荐阅读