ef core
ef core 简介
ORM:object relational mapping 让开发者用对象操作的形式操作关系型数据库
有那些orm:efcore dapper sqlsuger freesql
ef core 搭建
- 安装:install-package microsoft.entityframeworkcore.sqlserver
- 搭建:建立实体类 建立DbContext
- 安装:package microsoft.entityframeworkcore.tools
- 生成:add-migration name
- 修改表结构:fluntapi
ef core 增删改查
/// 增
// 1.使用dbcontext类
using(MyDbContext dbContext = new MyDbContext())
{
// 2.声明实体类,填充数据
Book book1 = new Book();
book1.Title = "高数";
book1.PubTime = new DateTime(2022, 4, 14);
book1.Prise = 40;
// 3.添加入dbContext,
dbContext.Add(book1);
// 4.更新状态
dbContext.SaveChanges();
}
/// 查
using (MyDbContext dbContext = new MyDbContext())
{
var bookResult = dbContext.Books.Where(p => p.Id == 1);
foreach (var item in bookResult)
{
Console.WriteLine(" ID "+ item.Id + " Title " + item.Title + " PubTime " + item.PubTime + " Prise " + item.Prise);
}
}
/// 改
using (MyDbContext dbContext = new MyDbContext())
{
Book book = dbContext.Books.Where(b => b.Id == 1).FirstOrDefault();
book.Title = "高数-改1";
await dbContext.SaveChangesAsync();
}
/// 删
using (MyDbContext dbContext = new MyDbContext())
{
var bookResult = dbContext.Books.Single(p => p.Id == 1);
dbContext.Books.Remove(bookResult);
await dbContext.SaveChangesAsync();
}
目前官方的的批量修改和删除多条数据的方法,都是查出来在一条条update delete
可以试用 Zack.EFCore.Batch 使用方法可查看 https://github.com/yangzhongke/Zack.EFCore.Batch; 但其无法保证数据的状态一致,在使用增删改的操的之后,再新建一个dbcontext
FluentAPI 使用建议
ercore默认的规则:约定大于配置
两种配置方式
将配置以特性(annotation)的形式标注在实体类中
简单 耦合
[Table("T_Books")]
public class Book{}
2.FluentAPI
bulider.ToTable("T_Books");
复杂 解耦
可以混用,但不推荐
使用efcore高级特性的时候谨慎,尽量不要和业务混合在一起,不如ignore、shadow、table splitting等
EF Core中主键的使用
efcore支持多种主键生成策略:自增,guid hi/li算法
自增:
优点 简单
缺点 数据库迁移以分布式系统比较麻烦,并发性能差4
guid
优点:适用于分布式系统,在多个数据库数据合并的时候简单
缺点:占用磁盘空间大,在把guid类型做主键的时候,不能把主键设为聚集索引,聚集索引是按照顺序保存主键的,mysql主键是强制使用聚集索引的
使用:可以让自增和guid混合使用,自增为物理主键,guid为混合主键
Hi/Lo算法
优化自增列,主键由两部分组成,高位(Hi)低位(Li);数据库生成高高位,低位本地生成,两个高位之间隔若干值 ,但不是efcore标准
magrations
使用迁移脚本可以对当前数据库进行向上迁移和向下迁移,
除非有特殊需要,否则不要删除magrations文件夹下的代码