Entity Framework Core
文章目录
- 一、Entity Framework Core
- 二、使用步骤
- 1.引入NuGet包
- 2.创建实体
- 3.实现实体配置类
- 5、默认约定都有那些
- 6.创建继承自DbContext的类
- 7、使用迁移命令将实体的结构同步到数据库
- 8、增删改查
- 三、反向工程
- 四、关于主键
一、Entity Framework Core
Entity Framework Core (EF Core) 是适用于 .NET 的新式对象数据库映射器。 它支持 LINQ查询、更改跟踪、更新和架构迁移。
EF Core 通过数据库提供程序插件模型与 SQL Server/Azure SQL 数据库、SQLite、Azure、Cosmos DB、MySQL、PostgreSQL 和更多数据库配合使用。
优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;
缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。
官方文档地址
二、使用步骤
1.引入NuGet包
Install-Package Microsoft.EntityFrameworkCore.SqlServer //SqlServer库
Install-Package Microsoft.EntityFrameworkCore.Design //.NET Core CLI
Install-Package Microsoft.EntityFrameworkCore.Tools //包管理器控制台工具
2.创建实体
public class Book{/// <summary>/// 主键ID/// </summary>public long Id { get; set; }/// <summary>/// 标题/// </summary>public string Title { get; set; }/// <summary>/// 发布时间/// </summary>public DateTime PubTime { get; set; }/// <summary>/// 单价/// </summary>public double Price { get; set; }}
3.实现实体配置类
public class BookConfig : IEntityTypeConfiguration<Book>{public void Configure(EntityTypeBuilder<Book> builder){//声明表名称builder.ToTable("Books");//声明Title 这个字段必填,长度为50.builder.Property(x => x.Title).HasMaxLength(50).IsRequired();}}
这里使用的是Fluent API 的方式来创建实体和表之间的说明。微软还为我们提供了Data Annotation的形式来标注(把配置已特性的形式标注在实体类中)。代码如下:
[Table("Books")]public class Book{/// <summary>/// 主键ID/// </summary>public long Id { get; set; }/// <summary>/// 标题/// </summary>[Required][MaxLength(50)]public string Title { get; set; }/// <summary>/// 发布时间/// </summary>public DateTime PubTime { get; set; }/// <summary>/// 单价/// </summary>public double Price { get; set; }}
Data Annotation优缺点:优点:简单;缺点:耦合;
Fluent API 优缺点:优点:复杂;缺点:解耦;
优先级:Fluent API > Data Annotation > 默认约定
这两种方式可以混合使用,但是不推荐混合使用。推荐还是使用Fluent API,至于Fluent API能为我们干什么,EFCore官方文档写的很清楚,这里不在一一赘述。
5、默认约定都有那些
- 表名采用DbContext中的对应的DbSet的属性名
- 数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型
- 数据表列的可空性取决于对应实体类属性的可空性
- 名字为Id的属性为主键,如果主键为short, int 或者 long类型,则默认采用自增字段,如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值
6.创建继承自DbContext的类
internal class TestDbContext : DbContext{public DbSet<Book> Books { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;DataBase=demo1;user=sa;pwd=123456;TrustServerCertificate=true;MultipleActiveResultSets=true;";optionsBuilder.UseSqlServer(connStr);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//从当前程序集加载所有继承了IEntityTypeConfiguration的类modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
7、使用迁移命令将实体的结构同步到数据库
相关命令:
命令 | 说明 |
---|---|
Add-Migration | 添加新的迁移 |
Bundle-Migration | 创建可执行文件以更新数据库 |
Drop-Database | 删除数据库 |
Get-DbContext | 列出并获取有关可用 DbContext 类型的信息 |
Get-Migration | 列出可用的迁移 |
Optimize-DbContext | 生成 DbContext 使用的模型的已编译版本 |
Remove-Migration | 删除上次迁移(回退为迁移所做的代码更改) |
Scaffold-DbContext | 为 DbContext 生成代码,并为数据库生成实体类型。 为了让 Scaffold-DbContext 生成实体类型,数据库表必须具有主键。 |
Script-DbContext | 从 DbContext 生成 SQL 脚本。 绕过任何迁移 |
Script-Migration | 生成一个 SQL 脚本,该脚本将所有更改从一个选定的迁移应用到另一个选定的迁移 |
Update-Database | 将数据库更新到上次迁移或指定的迁移 |
命令的具体用法,请查看官方文档。
在这里,我们使用 Add-Migration Init 命令添加一个迁移,命名为Init。生成后,项目中会出现一个文件夹,用来记录我们每次迁移的变更情况。
再使用 Update-Database 命令将数据库进行一次更新。更新后,数据库中就会显示显示出我们生成的表。
8、增删改查
这里只演示了最简单的用法,具体的用法大家去查看官方文档即可。
static async Task Main(string[] args){using (TestDbContext txb = new TestDbContext()){//添加Book book = new Book();book.Title = "Test";book.Price = 10;book.PubTime = DateTime.Now;txb.Add(book);var i = await txb.SaveChangesAsync();Console.WriteLine(i);//修改var i = txb.Books.Single(it => it.Id == 1);i.Title = "测试";int b = await txb.SaveChangesAsync();Console.WriteLine(b);//删除var i = txb.Books.Single(it => it.Id == 1);txb.Remove(i);int b = await txb.SaveChangesAsync();Console.Write(b);//查询var i = txb.Books.Count();Console.WriteLine(i);Console.ReadLine();}}
三、反向工程
在现有表的情况下,可以使用反向工程,通过命令来根据表结构生成实体和对应关系。
Scaffold-DbContext 'Server=.;Database=demo1;Trusted_Connection=True;MultipleActiveResultSets=true' Microsoft.EntityFrameworkCore.SqlServer
注意:
- 生成的实体类可能不能满足项目的要求,可能需要手工修改或者增加配置。
- 当表有修改时,再次运行反向工程工具,对文件所做的任何更改都将丢失。
- 不建议把反向工具当成了日常开发工具使用,不建议DBFirst。
四、关于主键
EF Core支持多种主键生成策略:自动增长、Guid、Hi/Lo算法等。
自动增长:
优点:简单;缺点:数据库迁移以及分布式系统中比较麻烦;并发性能差。long、int等类型主键,默认是自增。因为是数据库生成的值,所以SaveChanges后会自动把主键的值更新到Id属性。自增字段的代码中不能为Id赋值,必须保持默认值0,否则运行的时候就会报错。
Guid
Guid算法(或UUID算法)生成一个全局唯一的Id。适合于分布式系统,在进行多数据库数据合并的时候很简单。优点:简单,高并发,全局唯一;缺点:磁盘空间占用大。
Guid值不连续。使用Guid类型做主键的时候,不能把主键设置为聚集索引。因为聚集索引是按照顺序保存主键的,因此用Guid做主键性能差。比如MySQL的InnoDB引擎中主键是强制使用聚集索引的。有的数据库支持部分的连续Guid,比如SQLServer中的NewSequentialId(),但也不能解决问题。在SQLServer等中,不要把Guid主键设置为聚集索引;在MySQL中,插入频繁的表不要用Guid做主键。
其它方案
- 混合自增和Guid(非复合主键)。用自增列做物理的主键,而用Guid列做逻辑上的主键。把自增列设置为表的主键,而在业务上查询数据时候把Guid当主键用。在和其他表关联以及和外部系统通讯的时候(比如前端显示数据的标识的时候)都是使用Guid列。不仅保证了性能,而且利用了Guid的优点,而且减轻了主键自增性导致主键值可被预测带来的安全性问题。
- Hi/Lo算法:EF Core支持Hi/Lo算法来优化自增列。主键值由两部分组成:高位(Hi)和低位(Lo),高位由数据库生成,两个高位之间间隔若干个值,由程序在本地生成低位,低位的值在本地自增生成。不同进程或者集群中不同服务器获取的Hi值不会重复,而本地进程计算的Lo则可以保证可以在本地高效率的生成主键值。但是HiLo算法不是EF Core的标准。
Entity Framework Core相关推荐
- Entity Framework Core 2.0的新特性
虽然EF Core 2.0存在大量槽点,但是它也给出了不少亮点.在本文中,我们将介绍这次发布版的部分亮点. \\ 数据库表切分(Table Splitting) \\ ORM常被吐槽是总是对所请求数据 ...
- ABP官方文档翻译 9.2 Entity Framework Core
Entity Framework Core 介绍 DbContext 配置 在Startup类中 在模块PreInitialize方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...
- Entity Framework Core 2.0 使用入门
本文转载自作者:晓晨Master(李志强) 原文章地址 https://www.cnblogs.com/stulzq/p/7717873.html 一.前言 Entity Framework(后面简称 ...
- Entity Framework Core介绍(1)
介绍 Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术. EF Core 可用作对象关系映射程序 (O/RM),以 ...
- oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)
前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...
- 在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句
在开发中,我们想在调试中查看EF Core执行的sql语句,可以使用SQL Studio Manager Tools工具,另一种方式是使用EF Core提供的日志.在ASP.NET Core使用Ent ...
- Entity Framework Core 6.0 预览4 性能改进
起因 微软在Build2021开发者大会上,发布Entity Framework Core 6.0(简称EFCore 6)预览第四版,号称是性能版本,性能提升主要对于Entity Framework ...
- Entity Framework Core 5中实现批量更新、删除
本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新.删除数据的开发包,并且分析了其实现原理,并且与其他实现方案做了比较. 一.背景 随着微软全 ...
- Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...
- 使用Entity Framework Core访问数据库(DB2篇)
上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子~问题 ...
最新文章
- tungsten开机启动及进程开启停止
- 卷积神经网络「失陷」,CoordConv来填坑
- 经典面试题:将有序数组、有序链表转换成平衡二叉树
- 拜托!这才是分布式系统CAP的正确打开方式!
- DIV+CSS 之 网页切图过程中div+css命名规则
- WOOTConf 2017:Lockpicking,Willie Nelson开发人员等等
- 3.过滤——相关滤波(Correlation Filtering)_3
- 百行征信大揭秘,字段中间找关系
- 印度:10美元电脑与全民免费上网
- 071 time模块
- HTML网页设计结课作业——11张精美网页 html+css+javascript+bootstarp
- Java 二叉树的层序遍历
- IT-RS-OSPF-V-link_Looped
- 10G 网络变压器 10GBASE-T与1000Base-T区别
- 在IE8中使用建行企业网银的解决方法
- 2021-04-06-MSF之永恒之蓝
- java 可重复map_map的键值可以重复吗
- C++基础2:ASC码中 ‘A’ 和 ‘a’ 分别在什么位置??
- 相关系数-excel-CORREL()
- 报错已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfileThere are no enabled repos