.NET Core 之 七 EF Core(一)

一、

        什么是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 官方文件

                实体类型-EF Core | Microsoft Docs

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值