一、
什么是ORM,用于关系型数据库和C#对象之间双向转换,让开发者用对象操作的形式操作关系数据库,比如Linq转sql在数据库中执行,类对应数据表
有哪些ORM:EF Core、Dapper、Sqlsugar、FreeSql等
EF Core与其他ORM比较,和Dapper的比较;
EF Cores 模型驱动,Dapper是数据库驱动
项目选择技术框架
EF Core与EF比较,DB First、Model First、Code First,推荐使用Code First
二、
用什么数据库
开发环境搭建
1、经典步骤:建实体类、建配置类、建DbContext;Migration生成数据库,编写调用EF Core的业务代码
2、建实体类
3、NuGet 安装 Microsoft.EntityFrameworkCore.SqlServer
4、创建实现了 IEntityTypeConfiguration接口的实体配置类,配置实体类和数据库表的对应关系
5、创建继承自 DbContext的类,重写 OnConfiguring和OnModelCreating方法
Migration数据库迁移
面向对象的ORM开发中,数据库不是程序员手动创建的,而是由Migration工具生成的,根据对象定义的变化,自动更新数据库中的表以及表结构的操作,叫做Migration(迁移)
NuGet 安装 Microsoft.EntityFrameworkCore.Tools
在“程序包管理器控制台”中执行命令
Add-Migration 【有意义的名字】 生成Migration文件
再执行 update-database 在数据库中生成表
修改类结构后,再执行 Add-Migration和update-database,更新数据库中的表
对表字段做限制,Fluent API
builder.Property(e=>e.Title).HasMaxLength(50).IsRequired()
最大长度为50 不能为空
配置类可以使用约定,不建配置类
三、Entity Framework CURD操作
插入数据
查询数据 Linq,EF Core会把Linq转成sql
修改数据,删除数据 先查询再修改或删除,再SaveChangesAsync()
EF Core目前没有高效的批量修改和删除功能
批量修改 删除,使用杨中科老师的开源库:Zack.EFCore.Batch
四、EF Core 实体配置
常用规则
1、表名采用DbContext中对应的DbSet的属性名
2、数据表列的名字采用实体类属性的名字,列的数据类型采用和实体属性类型最兼容的类型
3、数据表列的可空性取决于对应实体类属性的可空性
4、名字为Id的属性为主键,如果主键为short,int或者long类型,则默认采用自增字段,如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值
两种配置方式
1、Data Annotation,直接在类属性上写[ ],简单但不解耦
2、Fluent API,创建config类,复杂但解耦,灵活
可以混用,但不建议混用,有前后优先级,推荐使用Fluent API
技术选型,适度且合理复杂,人生经验,学复杂的值钱
Fluent API
1、视图与实体类映射:modelBuilder.Entity<Blog>().ToView("blogsView");
2、排除属性映射(不推荐使用)
modelBuilder.Entity<Blog>().Ignore(b=>b.Name2);
3、配置列名:
modelBuilder.Entity<Blog>().Property(b=>
b.BlogId).HasColumnName("blog_id");
4、配置列数据类型
builder.Property(e=e.Title).HasColumnType("varchar(200)")
//和HasMaxLength(200) 生成数据类型一样
char varchar nvarchar(推荐)
固定长度 存英文 存中英文
5、配置主键
默认把名字为Id或者“实体类型+Id”的属性作为主键,可以用HasKey()来配置其他属性作为主键。modelBuilder.Entity<Student>().HasKey(c=>c.Number);
支持复合主键,但是不建议使用
6、生成列的值(计算列-推荐,触发器等,数据库自动生成的列)
modelBuilder.Entity<Student>.Property(b=>
b.Number).ValueGeneratedOnAdd();
7、可以用HasDefaultValue()为属性设定默认值
modelBuilder.Entity<Student>().Property(b=>
b.Age).HasDefaultValue(6);
8、索引
modelBuilder.Entity<Blog>().HasIndex(b=>b.Url);
复合索引
moderlBuilder.Entity<Person>().HasIndex(p=>new {p.FirstName,p.LastName});
9、...
用EF Core太多高级特性的时候需谨慎,尽量不要和业务逻辑混合在一起,以免“不能自拔”,比如:Ignore,Shodow,Table Splitting等
五、
Fluent API 属性的不同写法,推荐使用lambda表达式的写法,可以检查错误,自动填充
遵从C#语法
链式编程代码风格,推荐;
Data Annotation和Fluent API 官方文件