EF Core (EntityFramework Core)是实体关系映射(O/RM)数据库访问框架。这个模式的好处就是让开发人员可以用对象模型来操作数据库,这是一种对开发人员较为友好的方式。

O/RM牛逼在哪?

非对象模型操作数据库,就要直接用sql语言来做大量的CURD操作(Creat 创建;update 更新;read 读取;delete 删除)。这些操作编写繁琐又容易出错,目的却只是为了操作数据库,而不是业务。而对象模型(O/RM)是基于业务,使用的就是自身的程序语言,相当于把操作数据库的细节给封装起来,让开发人员专心对付业务。但是这个模式也不是完美无缺,如果业务的重心,或者瓶颈就在于操作数据库,就是要精细化的控制数据库,那么封装就是多余的,即使再好的封装。

1. 创建模型

以下三种“约定”方式会产生模型(Model):

一、Dbset<模型a>

二、class 模型a{

list<模型b>;

}

三、modelBuilder.Entity<模型c>();

[NotMapped] 注释特性能阻止产生模型映射到数据库。

Fluent API(流api)可以阻止映射:modelBuilder.Ignore<被阻止的类型>()。

三种模型控制的优先级是 Fluent API > 注释特性 > 约定

1.1 模型内部数据

默认拥有get;set;的公共属性会被映射。

1.1.1 主键

属性名为ID或类型名Id将被映射为主键。

[Key] 注释特性设置为键。

modelBuilder.Entity<模型>().Haskey(c => c.属性被设置为键),这方法还可以设置多个键。

1.1.2 必须属性

[Required] 注释特性指定属性必须在提交数据库时提供值。

modelBuilder.Entity<模型>().Property(b => b.必须属性).IsRequired()。

1.1.2 数据长度

[MaxLength(500)]

modelBuilder.Entity<模型>().Property(b => b.属性).HasMaxLength(500);

1.1.3 隐藏属性

context.Entry(模型).Property(“隐藏属性“).CurrentValue =  DateTime.Now;

1.2 关系

主体实体(Principal entity)

依赖实体(Dependent entity) :相对而言

外键(Foreign key):存储关联实体的主体键的属性

主体键(Principal key):主键或备用键

导航属性 Navigation property(集合导航属性,引用导航属性,反向导航属性):用关联实体类型定义的属性

[ForeignKey] 注释特性用在导航属性上来指定外键

[InversePropery] 注释特性指定反向导航属性

1.2.1 完全定义的关系

主体实体包含导航属性指向依赖实体;依赖实体包含外键和反向导航属性。

1.2.2 没有外键

自动生成外键的隐藏属性

1.2.3 单个导航属性

只需要单个导航属性,就可以确认关系

1.3 关系数据库建模

[Table(“表名”)] 表映射

[Column(“列名’)] 列映射

2. 查询数据

.TOList() 跟踪(变更)查询。相当于CURD中的R

.AsNoTracking().ToList() 不跟踪(变更)查询,速度更快。

默认情况下,如果不返回实体(而只是返回实体的一部分属性)将不实施跟踪。

.FromSql(“SQL语句”).ToList() 用原始SQL执行查询。

3. 保存数据

.SaveChanges() 保存(跟踪的)所有变更。

.Add()  相当于CURD中的C

修改属性  相当于U

.Remove()  相当于D

可以针对每一条记录的变更自动跟踪修改的模式(CUD),然后执行相关的CURD操作,程序员不需要记住每一次变更,小心翼翼地编写sql语句,这是O/RM的魅力所在。

4. 常用数据库

Microsoft.EntityFrameworkCore.SqlServer   ms sql server

Microsoft.EntityFrameworkCore.Sqlite sqlite

MySql.Data.EntityFrameworkCore mysql

EntityFrameworkCore.Jet access

Npgsql.EntityFrameworkCore.PostgreSQL postgresql

5. 管理数据库架构

为了保持EF Core 模型和数据库架构同步,有两个方式:

迁移(Migrations):以EF Core model为源采取的同步方法

反向工程(Reverse Engineering):以数据库架构为源,同步到ef core模型

5.1 迁移

产生迁移准备文件:

PowerShell:

Add-Migration InitialCreate

Console:

dotnet ef migrations add InitialCreate

更新到数据库架构:

powershell: Update-Database

console: dotnet ef database update

添加新的迁移:

powershell: Add-Migration 新迁移项目

console: dotnet ef migrations add 新迁移项目

删除迁移:

powershell: Remove-Migration

console: dotnet ef migrations remove

还原迁移:

powershell: Update-Database 迁移项目

console: dotnet ef database update 迁移项目

程序内方法:

myDbContex.Database.Migrate() 执行迁移。

EnsureCreated() 将会导致迁移失败。

保证模型和数据库之间的同步,是很关键的基础工作。在这个基础之上,对模型的操作才有意义,简便性才体现出来。

开发过程中,几乎不可能不修改模型,无法一劳永逸,所以要掌握好同步工具。

5.2 反向工程

Scaffold-DbContext –Connection<string> –Provider <String> –OutputDir <string>

ef学习记录的更多相关文章

  1. 个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 2

    接上篇:个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 1 Step1 在主程序中设置连接数据库 从Model类库的 App.Config 把数据库字符串拷贝出来, ...

  2. EF学习笔记(十二):EF高级应用场景

    学习总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上篇链接:EF学习笔记(十一):实施继承 本篇原文链接:Advanced Entity Framework Scenari ...

  3. EF学习笔记(十) 处理并发

    总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(九):异步处理和存储过程 本篇原文链接:Handling Concurrency Concurrency ...

  4. Python大神成长之路: 第三次学习记录 集合 函数 装饰 re

    学习记录day03   字符串可以直接切片,But字符串不可修改 字符串修改:生成了一个新的字符串 LIst修改,在原基础上修改(原内存上)     集合是一个无序的,不重复的数据组合,它的主要作用如 ...

  5. Entity Framework学习记录

    记录一次ef code first的学习记录 最近想做一套自己的框架,正在寻找合适的ORM,之前参照力软(很早之前的版本了)的底层代码,做了一套自己的增删改查, 但是使用起来总觉得缺了点什么? 所以决 ...

  6. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  7. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  8. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  9. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

随机推荐

  1. VBA实现相同行合并

    帮人捣鼓了个VBA代码用来实现多行合并,具体需求为:列2/列3/列4 相同的情况下,则对应的行合并为一行,且列1用空格隔开,列5则相加: (对大多数办公室职员,VBA还算是提高效率的一个利器吧) 最终 ...

  2. 【Linux】使用 iperf 测试 Linux 服务器带宽

    iperf 简介 iperf 是一个用于测试网络带宽的命令行工具,可以测试服务器的网络吞吐量.目前发现两个很实用的功能: 测试服务器网络吞吐量:如果我们需要知道某台服务器的「最大」网络带宽,那么最好在 ...

  3. 【CRS】vipca最后一步执行报错CRS-0215

    当我们在安装Clusterware 的时候, 需要在第二节点上vipca , 配置到最后安装的时候, 安装到 75% 左右,报错:     CRS-0215 : Could not start res ...

  4. PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)

    说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...

  5. JS复习笔记一:冒泡排序和二叉树列

    在这里逐步整理一些JS开发的知识,分享给大家: 一:冒泡排序 使用场景:数组中根据某个值得大小来对这个数组进行整体排序 难度:简单 原理:先进行循环,循环获取第一至倒数第二的范围内所有值,对当前值与下 ...

  6. Linux中让终端输入变为非阻塞的三种方法

    介绍 在linux下每打开一个终端,系统自动的就打开了三个文件,它们的文件描述符分别为0,1,2,功能分别是"标准输入"."标准输出"和"标准错误输出 ...

  7. Vue中:error 'XXXXX' is not defined no-undef解决办法

    Vue中:error 'XXXXX' is not defined no-undef解决办法 报错内容: × Client Compiled with some errors in 7.42s √ S ...

  8. go mod 以及vscode解决被墙的插件问题

    https://blog.csdn.net/weixin_39003229/article/details/97638573?utm_medium=distribute.pc_relevant.non ...

  9. JAXB学习(二): 对JAXB支持的主要注解的说明

    我们在上一篇中对JAXB有了一个大致的认识,现在我们来了解JAXB的一些主要注解. 顶层元素:XmlRootElement 表示整个XML文档的类应该使用XmlRootElement修饰,其实就像之前 ...

  10. CF733F

    扯在前面 人生第一道黑(>▽< ). 那天听了老师讲图论讲了这道题,发现这道黑题并不是很黑于是就做了做,在同机房dalao的帮助下三个小时做完(太菜了),于是来发篇题解. 正文 题意 给出 ...