postgres数据库结构:
数据库中有两张表,一个 class ,带有 class_id 和 class_name字段,另一张 student表有四个字段如图所示。
自动生成实体类工具(Database-First)
- 可以选择下面两种方式中的一个 自动生成实体类(在项目的根目录下运行一下命令)
- 在所有平台的通用方式
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