.NET Core之EF Core

目录

一、什么是ORM

二、什么是EF Core

三、EF Core的增删改查

查询

添加

更新

删除

四、 批量更新

 使用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

 Bulk相关(一条操作一个事务,均是传入实体)

//查询
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);

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咬口大葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值