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的更多相关文章

  1. 【.Net Core 学习系列】-- EF Core 实践(Code First)

    一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二解决方案: 新建项目: File --> New --> Project -->   ...

  2. 【.Net Core 学习系列】-- EF Core实践(DB First)

    一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二.准备数据: CREATE DATABASE [Blogging]; GO USE [Blogging ...

  3. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  4. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]

    原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...

  5. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]

    原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...

  6. .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...

  7. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  8. .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...

  9. .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...

随机推荐

  1. Android版数据结构与算法(四):基于哈希表实现HashMap核心源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的,并且存储的key只能有一个为 ...

  2. Vue.js 学习笔记 第2章 数据绑定和第一个Vue应用

    本篇目录: 2.1 Vue实例与数据绑定 2.2 指令与事件 2.3 语法糖 学习任何一种框架,从一个Hello World应用开始是最快了解该框架特性的途径. 我们先从一段简单的HTML代码开始,感 ...

  3. UiPath如何实现暂停功能?

    照理说一个无人值守的机器人原本是不应该有人工操作介入的,也就不会提供暂停功能.但客户可能出于业务需要,或者风险管控的考虑,会需要机器人具备暂停功能.通常,会希望在机器人运行时,用户摁下快捷键,机器人就 ...

  4. 高通QCC3026蓝牙音频芯片处理器介绍

    QCC3026是一款基于超低功耗架构的入门级闪存可编程蓝牙音频SoC,专为紧凑型功能优化的Qualcomm TrueWireless耳塞而设计.QCC3026旨在为我们的客户提供有助于缩短开发时间并具 ...

  5. sublime实现markdown浏览器预览

    效果预览 实现 首先下载插件OmniMarkupPreviewer 方法:ctrl + shift + P 安装完成后搜索'OmniMarkupPreviewer'双击即可 下载完成后新建.md文件 ...

  6. Windows Server 2016-Netdom Join加域并指定OU (一)

    前边我们提到了客户端如何通过图形化.netdom .Powershell方式加域,这里我们简单补充下生产环境中如何通过有权限的用户账号加域并指定对应的OU,以防止域策略下发对部分生产服务器权限等内容进 ...

  7. Pytorch实战1:线性回归(Linear Regresion)

    GitHub代码练习地址:https://github.com/Neo-ML/MachineLearningPractice/blob/master/Pytorch01_LinearRegressio ...

  8. WinServer配置MySQL主从同步

    为什么要配置主从同步? 如果一台数据库服务器挂了,还有一个备用 为了方便配置,我采用两台WinServer2003虚拟机: 1.前期准备工作:安装好镜像文件,VMTOOLS,MySQL5.5 我这里以 ...

  9. N元模型

    在自然语言处理的任务中,拼音纠错.机器翻译等任务都需要对某个句子的下一个单词进行预测,或者评估某个句子的概率大小.例如预测如下句子的下一个单词: Please turn your home work. ...

  10. AI - TensorFlow - 可视化工具TensorBoard

    TensorBoard TensorFlow自带的可视化工具,能够以直观的流程图的方式,清楚展示出整个神经网络的结构和框架,便于理解模型和发现问题. 可视化学习:https://www.tensorf ...