文章目录

  • 一、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做主键。

其它方案

  1. 混合自增和Guid(非复合主键)。用自增列做物理的主键,而用Guid列做逻辑上的主键。把自增列设置为表的主键,而在业务上查询数据时候把Guid当主键用。在和其他表关联以及和外部系统通讯的时候(比如前端显示数据的标识的时候)都是使用Guid列。不仅保证了性能,而且利用了Guid的优点,而且减轻了主键自增性导致主键值可被预测带来的安全性问题。
  2. Hi/Lo算法:EF Core支持Hi/Lo算法来优化自增列。主键值由两部分组成:高位(Hi)和低位(Lo),高位由数据库生成,两个高位之间间隔若干个值,由程序在本地生成低位,低位的值在本地自增生成。不同进程或者集群中不同服务器获取的Hi值不会重复,而本地进程计算的Lo则可以保证可以在本地高效率的生成主键值。但是HiLo算法不是EF Core的标准。

Entity Framework Core相关推荐

  1. Entity Framework Core 2.0的新特性

    虽然EF Core 2.0存在大量槽点,但是它也给出了不少亮点.在本文中,我们将介绍这次发布版的部分亮点. \\ 数据库表切分(Table Splitting) \\ ORM常被吐槽是总是对所请求数据 ...

  2. ABP官方文档翻译 9.2 Entity Framework Core

    Entity Framework Core 介绍 DbContext 配置 在Startup类中 在模块PreInitialize方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...

  3. Entity Framework Core 2.0 使用入门

    本文转载自作者:晓晨Master(李志强) 原文章地址 https://www.cnblogs.com/stulzq/p/7717873.html 一.前言 Entity Framework(后面简称 ...

  4. Entity Framework Core介绍(1)

    介绍 Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术. EF Core 可用作对象关系映射程序 (O/RM),以 ...

  5. oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  6. 在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句

    在开发中,我们想在调试中查看EF Core执行的sql语句,可以使用SQL Studio Manager Tools工具,另一种方式是使用EF Core提供的日志.在ASP.NET Core使用Ent ...

  7. Entity Framework Core 6.0 预览4 性能改进

    起因 微软在Build2021开发者大会上,发布Entity Framework Core 6.0(简称EFCore 6)预览第四版,号称是性能版本,性能提升主要对于Entity Framework  ...

  8. Entity Framework Core 5中实现批量更新、删除

    本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新.删除数据的开发包,并且分析了其实现原理,并且与其他实现方案做了比较. 一.背景 随着微软全 ...

  9. Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令

    在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...

  10. 使用Entity Framework Core访问数据库(DB2篇)

    上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子~问题 ...

最新文章

  1. tungsten开机启动及进程开启停止
  2. 卷积神经网络「失陷」,CoordConv来填坑
  3. 经典面试题:将有序数组、有序链表转换成平衡二叉树
  4. 拜托!这才是分布式系统CAP的正确打开方式!
  5. DIV+CSS 之 网页切图过程中div+css命名规则
  6. WOOTConf 2017:Lockpicking,Willie Nelson开发人员等等
  7. 3.过滤——相关滤波(Correlation Filtering)_3
  8. 百行征信大揭秘,字段中间找关系
  9. 印度:10美元电脑与全民免费上网
  10. 071 time模块
  11. HTML网页设计结课作业——11张精美网页 html+css+javascript+bootstarp
  12. Java 二叉树的层序遍历
  13. IT-RS-OSPF-V-link_Looped
  14. 10G 网络变压器 10GBASE-T与1000Base-T区别
  15. 在IE8中使用建行企业网银的解决方法
  16. 2021-04-06-MSF之永恒之蓝
  17. java 可重复map_map的键值可以重复吗
  18. C++基础2:ASC码中 ‘A’ 和 ‘a’ 分别在什么位置??
  19. 相关系数-excel-CORREL()
  20. 报错已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfileThere are no enabled repos

热门文章

  1. 十大超越人类极限的未来技术(组图)
  2. nginx-rtmp搭建流媒体服务器实践
  3. 结合tkinter与opencv爬取豆瓣电影
  4. 软件工程 计算机网络 路由器RIP协议基本配置
  5. 腾讯犀牛鸟云开发新生工程教育百校同行计划全面启动
  6. 建造者模式(Bulider模式)详解
  7. 计算机小白的养成之路
  8. jPlayer 详解
  9. 更换主板后出现无法设置你的PIN,请重试
  10. 第一章 GEE账号注册