.NET Core 学习笔记3——EF Core
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>
.NET Core 学习笔记3——EF Core的更多相关文章
- 【.Net Core 学习系列】-- EF Core 实践(Code First)
一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二解决方案: 新建项目: File --> New --> Project --> ...
- 【.Net Core 学习系列】-- EF Core实践(DB First)
一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二.准备数据: CREATE DATABASE [Blogging]; GO USE [Blogging ...
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...
- .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]
原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...
- .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]
原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...
- .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]
为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...
- .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]
原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...
- .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式
原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...
- .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式
原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...
随机推荐
- Java日志正确使用姿势
前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中“尽情”的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的bug发生,作为一名 ...
- Asp.NetCore轻松学-使用Docker进行容器化托管
前言 没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,作为硬 ...
- Python爬虫入门教程 38-100 教育部高校名单数据爬虫 scrapy
爬前叨叨 今天要爬取一下正规大学名单,这些名单是教育部公布具有招生资格的高校名单,除了这些学校以外,其他招生的单位,其所招学生的学籍.发放的毕业证书国家均不予承认,也就是俗称的野鸡大学! 网址是 ht ...
- 【工具】-RAP接口管理工具
前言 RAP 是一个可视化接口管理工具, 通过分析接口结构,动态生成模拟数据,校验真实接口正确性, 围绕接口定义,通过一系列自动化工具提升我们的协作效率. 在 RAP 中,您可定义接口的 URL.请求 ...
- winfrom 图片等比例压缩
效果图: 核心代码: /// <summary> /// 等比例缩放图片 /// </summary> /// <param name="bitmap" ...
- CSS Sprites(基本写法,怎样使用)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/XTQueen_up/article/details/37601361 说白就是用样式表切一个大图片 ...
- TTL 和 DNS TTL 的区别
TTL TTL是 Time To Live 的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量.TTL是IPv4包头的一个8 bit字段.在IPv4包头中TTL是一个8 bit字段,它位于 ...
- 识别率很高的java文字识别技术
java文字识别程序的关键是寻找一个可以调用的OCR引擎.tesseract-ocr就是一个这样的OCR引擎,在1985年到1995年由HP实验室开发,现在在Google.tesseract-ocr ...
- 一句话HTML编辑器
一句话HTML编辑器 data:text/html,<body oninput="i.srcdoc=h.value"><style>#i{width:70% ...
- Android or Java的回调粗俗理解 这才是最通俗易懂的
FUCK,网上装逼者甚众矣! 网上一堆关于JAVA函数回调的见解文章,都说自己写的明白,但没几个我看的明白的. 不如自己写一个东西,回头自己看着舒服 回调函数:定义自己百度 干嘛的? 场景就是事务A执 ...