目录
使用EFCore.BulkExtensions操作Postgresql
使用 Zack.EFCore.Batch.MySQL.Pomelo_NET6 操作Mysql
一、什么是ORM
对象关系映射,就是让开发者用对象操作的形式操作数据库
有哪些ORM:EF Core、Dapper、SqlSugar、FreeSql等。
二、什么是EF Core
(EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。EF Core 支持多个数据库引擎。
三、EF Core的增删改查
先new一个context实例,通过绑定跟踪的DbSet实体,实现数据操作
private CodeFContext codeFContext= new CodeFContext();
查询
private List<Book> _books;
public List<Book> Books
{
get => _books;
set => SetProperty (ref _books, value);
}
//查询Book表所有数据
Books = codeFContext.Books.ToList();
//条件查询,linq操作
Books = codeFContext.Books.Where(x => x.Id > 3).ToList();
添加
private async void InsertData()
{
var books=new List<Book>() {
new Book() { Title ="追风筝的人"},
new Book() { Title ="霍乱时期的爱情"}
};
//修改DbSet
codeFContext.Books.AddRange(books);
//再save更改
await codeFContext.SaveChangesAsync();
}
更新
private async void UpdateData()
{
//需要先查询
var books = codeFContext.Books.Where(x => x.Title == "追风筝的人");
//再对查询到的数据进行修改
foreach (var item in books)
{
item.Title = "放学后";
}
//再save更改
await codeFContext.SaveChangesAsync();
}
删除
private async void DeleteData()
{
//先Linq查询
var books= codeFContext.Books.Where(x => x.Id>5);
//从实体中删除数据
codeFContext.Books.RemoveRange(books);
//再save更改
await codeFContext.SaveChangesAsync();
}
四、 批量更新
使用EFCore.BulkExtensions操作Postgresql
//查询
List<Student> students =new List<Student>();
await dbFContext.BulkReadAsync(students);
//插入
var students = new List<Student>(){
new Student() {Id=1, Name = "AA" ,StuNum="2010"},
new Student() {Id=2, Name = "BB" ,StuNum="2011"},
new Student() {Id=3, Name = "CC",StuNum="2012" }};
await dbFContext.BulkInsertAsync(students);
//删除
var stus = dbFContext.Students;
await dbFContext.BulkDeleteAsync(stus.ToList());
//更新
var stus = dbFContext.Students.ToList();
foreach (var item in stus)
{
item.Name += "QQQ";
}
await dbFContext.BulkUpdateAsync(stus);
Batch相关(按条件)
//删除
await dbFContext.Students.Where(x=>x.Name=="BB").BatchDeleteAsync();
//更新(改成新数据)
await dbFContext.Students.Where(x => x.StuNum == "2222").BatchUpdateAsync(new Student() {StuNum="2233" });
//更新(基于原数据)
await dbFContext.Students.Where(x => x.StuNum == "2233").BatchUpdateAsync(x=>new Student() { StuNum =x.StuNum+ "444" });
事务
//Bulk相关(一条操作一个事务,均是传入实体)
//直接使用这些操作时,每个操作都是独立的事务,并且会自动提交。
//如果我们需要在单个过程中执行多个操作,则应使用显式事务
public async void TransactionTest()
{
using (var transaction= dbFContext.Database.BeginTransaction())
{
try
{
var students = new List<Student>(){
new Student() {Id=6, Name = "DD" ,StuNum="2044"},
new Student() {Id=7, Name = "EE" ,StuNum="2055"}};
await dbFContext.BulkInsertAsync(students);
await dbFContext.Students.Where(x => x.StuNum == "2044").BatchUpdateAsync(new Student() { Name = "DDEEF" });
transaction.Commit();
}
catch (Exception ex )
{
//using包裹不需要手写rollback,报错会自动回滚
Console.WriteLine(ex.Message);
}
}
}
使用 Zack.EFCore.Batch.MySQL.Pomelo_NET6 操作Mysql
//添加配置
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseBatchEF_MySQLPomelo();
}
}
//批量删除,
await codeFContext.DeleteRangeAsync<Book>(x=>x.Id>5);
//批量更新,条件,设置更新的列和值,执行
await codeFContext.BatchUpdate<Book>()
.Where(x => x.Title == "放学后")
.Set(x=>x.Title,x=>x.Title+"Test")
.Set(x=>x.Price,x=>20)
.ExecuteAsync();
//批量删除和批量更新都支持通过Take()、Skip()来实现部分删除和部分更新
// Take(3) 代表选取3个 ,如果满足条件的不足3个 那就有几个选几个 可以一个都没有,超过的话只选顺序前 3 个
await codeFContext.Books.Where(x=>x.Id>5).Take(3).DeleteRangeAsync(codeFContext);
//Skip(3) 代表跳过3个 ,如果满足条件的不足3个 那就有几个选几个 跳过几个,超过的话只跳过顺序的前 3 个
await codeFContext.BatchUpdate<Book>()
.Where(x => x.Title == "放学后")
.Set(x => x.Title, x => x.Title + "Test")
.Set(x => x.Price, x => 20)
.Skip(3)
.ExecuteAsync();
//批量插入
var books=new List<Book>() {
new Book() { Title ="追风筝的人"},
new Book() { Title ="霍乱时期的爱情"}
};
await codeFContext.BulkInsertAsync(books);