ef学习记录
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学习记录的更多相关文章
- 个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 2
接上篇:个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 1 Step1 在主程序中设置连接数据库 从Model类库的 App.Config 把数据库字符串拷贝出来, ...
- EF学习笔记(十二):EF高级应用场景
学习总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上篇链接:EF学习笔记(十一):实施继承 本篇原文链接:Advanced Entity Framework Scenari ...
- EF学习笔记(十) 处理并发
总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(九):异步处理和存储过程 本篇原文链接:Handling Concurrency Concurrency ...
- Python大神成长之路: 第三次学习记录 集合 函数 装饰 re
学习记录day03 字符串可以直接切片,But字符串不可修改 字符串修改:生成了一个新的字符串 LIst修改,在原基础上修改(原内存上) 集合是一个无序的,不重复的数据组合,它的主要作用如 ...
- Entity Framework学习记录
记录一次ef code first的学习记录 最近想做一套自己的框架,正在寻找合适的ORM,之前参照力软(很早之前的版本了)的底层代码,做了一套自己的增删改查, 但是使用起来总觉得缺了点什么? 所以决 ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
随机推荐
- 【EXP】exp-00091解决办法
如果遇到exp的话一般都是因为字符集的问题 解决办法: 1.在oracle中查看数据库的字符集 SQL> select userenv('language') from dual; USEREN ...
- 【Oracle】userenv()函数介绍分析
说到这个userenv()使用起来还是很有用的 参数 功能 CLINET_INFO 返回最高可达64个字节存储的用户会话信 ...
- LR参数
一.LR函数 : lr_start_transaction: 为性能分析标记事务的开始 lr_end_transaction: 为性能分析标记事务的结束:事务名称与事务开始时保持一致 lr_ren ...
- D2Admin 登录用户重新初始话右侧菜单
背景 最近用到D2Admin开发项目,用户登录菜单要根据用户角色权限获取,但是又不想用官网的方案(vue基于d2-admin的RBAC权限管理解决方案),所以自己加了个只修改 menuAside的方案 ...
- window10系统安装
准备工作: 一个U盘,大概8GB左右的存储,用于存放windows镜像文件与驱动精灵离线版网卡驱动以及相关的应用应用软件等. window10镜像文件(iso文件) 微PE工具软件 软件下载: 前提: ...
- 用SAP浏览网页
在SAP里,通过两个类就可以做一个简单的,嵌入sap里的网页.这两个类就是 1. cl_gui_custom_container 这个类是自定义屏幕里用得,也就是画一个container,在这个容器中 ...
- Angular学习资料大全和常用语法汇总(让后端程序员轻松上手)
前言: 首先为什么要写这样的一篇文章呢?主要是因为前段时间写过一些关于Angualr的相关实战文章,有些爱学习的小伙伴对这方面比较感兴趣,但是又不知道该怎么入手(因为认识我的大多数小伙伴都是后端的同学 ...
- LinuxCentos7下安装Mysql8.x以及密码修改
LinuxCentos7下安装Mysql以及密码修改 引言: 之前都是用Docker或者yum自动安装,这次主要是下载压缩包解压安装,中间也有些小波折,记录如下,以供参考: 1.删除旧的MySQL 检 ...
- UT /SIT/ UAT
UT /SIT/ UAT - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1541268 我们公司只有测试环境--准生产环境--生产环 ...
- ftp协议服务器与tinyhttp服务demo
https://www.jianshu.com/p/fb9fcb69efc9 ....... https://www.jianshu.com/p/e9a2e0755496 ============== ...