NET Cores使用Entity Framework操作postgresql学习总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ITzhongzi/article/details/80987980

postgres数据库结构:

这里写图片描述

数据库中有两张表,一个 class ,带有 class_id 和 class_name字段,另一张 student表有四个字段如图所示。

自动生成实体类工具(Database-First)

  • 可以选择下面两种方式中的一个 自动生成实体类(在项目的根目录下运行一下命令)
    1. 在所有平台的通用方式
dotnet ef dbcontext scaffold "Host=localhost;Database=mydatabase;Username=myuser;Password=mypassword" Npgsql.EntityFrameworkCore.PostgreSQL

Or with Powershell:
2. 紧紧在windows平台下可以使用的方式

Scaffold-DbContext "Host=localhost;Database=mydatabase;Username=myuser;Password=mypassword" Npgsql.EntityFrameworkCore.PostgreSQL

要指定 生成的实体类和数据库对象的存放目录,需要在后面 加上 -o <存放的路径>

  • 运行结果:
    这里写图片描述
    可以看到,在 Models 目录下 生成了 我们数据库中对应的文件夹。
    这样,我们从数据库自动生成实体类的部分就完成了。

使用EF进行增删改查

  • 查询数据:
public static void Main(string[] args)
        {
            using (var db = new TestContext())
            {
                var student = (from t in db.Student where t.Name == "333" select t).First(); // 在student表 查询名字叫 333 的记录

                Console.WriteLine("名字: " + student.Name);
                Console.WriteLine("年龄: " + student.Age);
                Console.WriteLine("学号: " + student.StudentId);
                Console.WriteLine("班级号: " + student.ClassId);

                db.SaveChanges();   //保存结果
            }

//            CreateWebHostBuilder(args).Build().Run();
        }

运行结果:
这里写图片描述

  • 在student表中增加一条记录
 public static void Main(string[] args)
        {
            using (var db = new TestContext())
            {
//                var student = (from t in db.Student where t.Name == "小花" select t).FirstOrDefault(); // 在student表 查询名字叫 333 的记录
//              
//                Console.WriteLine("名字: " + student.Name);
//                Console.WriteLine("年龄: " + student.Age);
//                Console.WriteLine("学号: " + student.StudentId);
//                Console.WriteLine("班级号: " + student.ClassId);
//
//                db.Student.Remove(student); // 在student表 删除 名字叫 333 的记录

                // 在 student表中增加 一条记录
                var class_01 = new Class
                {
                    ClassName = "一班"
                };
                db.Student.Add(new Student
                {
                    ClassId = 1,
                    Name="秀云2",
                    Age=20,
                    Class = class_01
                });

                db.SaveChanges();   //保存结果
            }

//            CreateWebHostBuilder(args).Build().Run();
        }

运行结果:
这里写图片描述

我们可以看到, 数据库中student增加了 两条 记录 名字都叫 “秀云”,分在不同的班级。

  • 修改一条记录
 //修改一条记录
                var updateInfo = (from s in db.Student where s.Name == "小敏" select s).FirstOrDefault();
                Console.WriteLine("修改前-----------");
                Console.WriteLine("名字: " + updateInfo.Name);
                Console.WriteLine("年龄: " + updateInfo.Age);
                Console.WriteLine("学号: " + updateInfo.StudentId);
                Console.WriteLine("班级号: " + updateInfo.ClassId);

                updateInfo.Age = 888;
                updateInfo.ClassId = 1;

                Console.WriteLine("修改后-----------");

                Console.WriteLine("名字: " + updateInfo.Name);
                Console.WriteLine("年龄: " + updateInfo.Age);
                Console.WriteLine("学号: " + updateInfo.StudentId);
                Console.WriteLine("班级号: " + updateInfo.ClassId);

                db.SaveChanges();   //保存结果

运行结果:
这里写图片描述
这里写图片描述

总结

entity framework

方法名 描述
ADD 增加一条记录
Remove 删除一条记录
SaveChanges 保存结果,将修改提交到数据库

entity framework还有很多的方法和用途,本文就不一一赘述,只要了解怎么用,剩下的api去微软官网查询即可。

补充: 在EF使用事务

事务就是确保一次数据库操作,所有步骤都成功,如果哪一步出错了,整个操作都将回滚。在EF使用事务有两种方案,一种是EF自带的.BeginTransaction()方法,另一种是使用TransactionScope类。

  • 使用.BeginTransaction()
class Program
{
    static void Main(string[] args)
    {
        using (var db = new DBModel())
        {
            var tran = db.Database.BeginTransaction();  //开启事务
            try
            {
                var student = db.students.FirstOrDefault(s => s.name == "萝莉");
                db.students.Remove(student);    //删除萝莉
                db.SaveChanges();
                tran.Commit();  //必须调用Commit(),不然数据不会保存
            }
            catch (Exception ex)
            {
                tran.Rollback();    //出错就回滚
            }
        }
    }
}
  • 使用TransactionScope类(使用之前记得引入System.Transactions.dll)
class Program
{
    static void Main(string[] args)
    {
        using (var db = new DBModel())
        {
            using (var tran = new TransactionScope())   //开启事务
            {
                var student = db.students.FirstOrDefault(s => s.name == "萝莉");
                db.students.Remove(student);    //删除萝莉
                db.SaveChanges();
                tran.Complete();  //必须调用.Complete(),不然数据不会保存
            }   //出了using代码块如果还没调用Complete(),所有操作就会自动回滚
        }
    }
}

两种都可以,不过我觉得使用TransactionScope要方便一点。

entity framework官网:
entity framework

猜你喜欢

转载自blog.csdn.net/ITzhongzi/article/details/80987980