C# 数据操作系列 - 5. EF Core 入门
0.前言
上一章简单介绍了一下ORM框架,并手写了一个类似ORM的工具类。这一章将介绍一个在C#世界里大名鼎鼎的ORM框架——Entity Framework的Core版。
Entity Framework 非Core版目前已经更新到了6代,这是一款经过检验的ORM框架。在这里简单介绍一下Entity Framework(简称EF,额,别拿这个当关键字搜索,要不然你会被忽悠到一个英语培训机构的)的优点。
C#的设计理念是约定优于配置,意思就是通过一定程度的规范性格式化的写法来避免使用配置文件或者配置代码等。而EF可以说是很好的诠释了这个理念。
- EF可以在不使用任何配置的前提下,自动解析类与表之间的映射(具体的映射逻辑与我们手写的ORM工具类一致或相近)。
- 自动跟踪更改。在直接使用通过EF获取的元素时,EF会自动跟踪哪些字段发生了变化,当手动调用保存的时候,EF就会把数据回传给数据库。
- 可以延迟加载需要的数据,外键引用属性、查询结果等
- 丰富的映射关系,支持一对一,一对多,多对多,甚至继承、单表多实例等
- 可以使用Linq 进行查询
- 非Core版的可以通过数据库表生成实体类,两种都可以通过实体类生成表
- 基于 ADO.NET 的数据库连接和可用于连接到 SQL Server、Oracle、MySQL、SQLite、PostgreSQL、DB2 等
当然,还有一个特点:EF是约定优于配置,所以EF也可以配置。EF可以使用Fluent式配置,也可以使用配置文件进行配置。
说了一大堆Entity Framework的优点,那么就让我们开始使用Entity Framework Core吧。
这里简单介绍一下选择Core的原因,微乳这几年一直在主推跨平台战略。因为EF更多的是基于.NET Framework开发的,所以微软以EF为基础针对.net core做了一定的修改,然后EF Core诞生了。可以说EF Core是专门为.net core开发的。而且.net core有更多更好的发展。
1. Entity Framework Core安装
现在就让我们一起来试着用一下EntityFramework Core吧。
先新建一个项目:
Visual Studio

点下一步,选择Console程序:

点击创建
Visual Studio Code
dotnet new console -o ef_demo
cd ef_demo
然后用VS Code打开 ef_demo目录。
然后选择数据库:
这次与之前的选择不太一样,这次选择 SQLite这个数据库。这是一个超小型的数据库,可以不用安装任何附加软件,只要有一个文件,然后通过代码就可以访问了。
接下来,添加 EF的SQLite包:
在非Visual Studio环境下,安装一个三方库可以使用:
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
这个命令进行安装。这是dotnet命令行安装三方包的命令。对于Visual Studio或者Rider都可以通过图形化的NuGet安装三方包。
如果是使用NuGet的命令行界面进行安装的话,可以通过:
Install-Package Microsoft.EntityFrameworkCore.Sqlite
这行命令来安装NuGet包。
2. 入门级使用方式
先创建两个实体类:
public class ModelA
{
public int Id { get; set; }
public string Name { get; set; }
public List<ModelB> ModelBs { get; } = new List<ModelB>();
}
public class ModelB
{
public int Id { get; set; }
public string Name { get; set; }
public int ModelAId { get; set; }
public ModelA modelA { get; set; }
}
然后创建一个继承自
Microsoft.EntityFrameworkCore.DbContext
的上下文类:
public class DefaultContext: DbContext
{
public DbSet<ModelA> ModelAs { get; set; }
public DbSet<ModelB> ModelBs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite("Data Source=blogging.db");
}
注意在 OnConfiguration方法里设置连接字符串。
如果是使用的已有数据的数据库,则不需要进行下面的步骤,否则建议执行以下步骤,以便可以由EF Core提供的工具生成数据库:
在 NuGet的控制台界面,输入以下命令:
Install-Package Microsoft.EntityFrameworkCore.Tools
Add-Migration InitialCreate
Update-Database
或者在命令行界面输入:
dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet ef migrations add InitialCreate
dotnet ef database update
执行成功之后会在项目根目录下多出以下内容:

这是EF Core保留的迁移记录,以便下次使用。
如果项目根目录里没有 blogging.db 这个SQLite文件的话,会自动创建该文件,同时设置好表;如果有,但不是SQLite的文件,则会报错。
使用工具连接到blogging.db数据库,可以看到 EF自动生成的两个实体类对应表的DDL:
CREATE TABLE "ModelBs" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_ModelBs" PRIMARY KEY AUTOINCREMENT,
"Name" TEXT NULL,
"ModelAId" INTEGER NOT NULL,
CONSTRAINT "FK_ModelBs_ModelAs_ModelAId" FOREIGN KEY ("ModelAId") REFERENCES "ModelAs" ("Id") ON DELETE CASCADE
);
-- auto-generated definition
create table ModelAs
(
Id INTEGER not null
constraint PK_ModelAs
primary key autoincrement,
Name TEXT
);
先略过自动映射的关系,我们来看看如何使用:
var context = new DefaultContext();
//添加
context.Add(new ModelA { Id = 10, Name = "测试" });
context.SaveChanges();//保存数据到数据库中
//查询
var modelA = context.ModelAs.Where(p => p.Id > 1).First();
//更新
modelA.Name += DateTime.Now;
context.SaveChanges();
//删除
context.Remove(modelA);
context.SaveChanges();
context.Dispose();
这里简单的演示了一下如何使用,到目前为止EF Core可以满足了入门的开发。当然,EF并不只有这些。下一篇将介绍如何自定义映射关系。
更多内容烦请关注我的博客《高先生小屋》

C# 数据操作系列 - 5. EF Core 入门的更多相关文章
- C# 数据操作系列 - 6 EF Core 配置映射关系
0. 前言 在<C# 数据操作系列 - 5. EF Core 入门>篇中,我们简单的通过两个类演示了一下EF增删改查等功能.细心的小伙伴可能看了生成的DDL SQL 语句,在里面发现了些端 ...
- C# 数据操作系列 - 8. EF Core的增删改查
0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置. 这一篇,我带大家分享一下,我在工作中需要的EF Core的用法. 1 ...
- C# 数据操作系列 - 9. EF Core 完结篇
0.前言 <EF Core>实际上已经可以告一段落了,但是感觉还有一点点意犹未尽.所以决定分享一下,个人在实际开发中使用EF Core的一些经验和使用的扩展包. 1. EF Core的异步 ...
- C# 数据操作系列 - 7. EF Core 导航属性配置
在上一篇,大概介绍了Entity Framework Core关于关系映射的逻辑.在上一篇中留下了EF的外键映射没有说,也就是一对一,一对多,多对一,多对多的关系等.这一篇将为大家细细分析一下,如何设 ...
- C# 数据操作系列 - 12 NHibernate的增删改查
0. 前言 上一篇<C# 数据操作系列 - 11 NHibernate 配置和结构介绍> 介绍了Nhibernate里的配置内容.这一篇将带领大家了解一下如何使用NHIbernate.之前 ...
- C# 数据操作系列 - 15 SqlSugar 增删改查详解
0. 前言 继上一篇,以及上上篇,我们对SqlSugar有了一个大概的认识,但是这并不完美,因为那些都是理论知识,无法描述我们工程开发中实际情况.而这一篇,将带领小伙伴们一起试着写一个能在工程中使用的 ...
- C# 数据操作系列 - 16 SqlSugar 完结篇
0. 前言 前一篇我们详细的介绍了SqlSugar的增删改查,那些已经满足我们在日常工程开发中的使用了.但是还有一点点在开发中并不常用,但是却非常有用的方法.接下来让我们一起来看看还有哪些有意思的内容 ...
- C# 数据操作系列 - 19 FreeSql 入坑介绍
0. 前言 前几天FreeSql的作者向我推荐了FreeSql框架,想让我帮忙写个文章介绍一下.嗯,想不到我也能带个货了.哈哈,开个玩笑-看了下觉得设计的挺有意思的,所以就谢了这篇文章. 简单介绍一下 ...
- C# 数据操作系列 - 10 NHibernate初试
0. 前言 在上一篇基本讲完了EF Core的入门级教程.从这一篇开始,我们试着去探索一下 .net core平台上更多的ORM框架.那么,这一篇开始我们就来试试NHibernate. 1. NHib ...
随机推荐
- deepin右键发送博客
1. 概述 deepin系统上没有像样的笔记软件.为知笔记未提供deb打包的软件,很遗憾.商店提供的软件,界面停留在上个世纪了. 这个时候如果想通过笔记来分享到博客是一件非常困难的事情. 本篇博客就是 ...
- CTFHub web技能树 RCE
一个简单的ping,还没有过滤,源码也给出来了 ls一下 127.0.0.1 & ls 有一个可疑的php文件,,,但是直接访问和 cat 都出不来... 试了几下反弹shell,没成功... ...
- 《并发编程的艺术》阅读笔记之Lock与AQS
Lock接口 在jdk1.5之后,并发包下新增了一个lock接口,lock接口定义了锁的获取,锁的释放,等方法,需要用户手动设置.与关键字不同的是,lock具有可操作性,比如,可以中断线程,设置超时时 ...
- 女屌丝前端逆袭记(一)之浅谈float
提到前端,相信作为开发者的你或是正在看这篇文章的你并不陌生.前端可以说是直接与用户打交道的一个端口,不论是页面前端亦或是后端界面的前端,都是直接与用户对接的,因此前端设计对于一个网站或管理系统,都是至 ...
- pytorch实现手动线性回归
import torch import matplotlib.pyplot as plt learning_rate = 0.1 #准备数据 #y = 3x +0.8 x = torch.randn( ...
- python 异步Web框架sanic
我们继续学习Python异步编程,这里将介绍异步Web框架sanic,为什么不是tornado?从框架的易用性来说,Flask要远远比tornado简单,可惜flask不支持异步,而sanic就是类似 ...
- Xshell下载和连接Linux
Xshell下载和连接Linux 第一步.Xshell的下载 方法1:从官网下载个人使用时免费的,商业使用是要收费的. http://www.xshellcn.com/ 方法二2:百度云下载Xshel ...
- Spring Boot Starters介绍
文章目录 Web Start Test Starter Data JPA Starter Mail Starter 结论 对于任何一个复杂项目来说,依赖关系都是一个非常需要注意和消息的方面,虽然重要, ...
- 用libevent写的海康摄像头rtsp客户端
之前一直使用live555作为RTSP的客户端,但其框架臃肿,虽然支持各种格式,但实际中并没有这些需求,关键是其注重于格式的解析,却不注重网络IO,单线程下性能也不高,重新用libevent编写rts ...
- while循环脚本
[root@oldboy ~]# (while :;do date;sleep 5;done)& fg ctrl c退出 fg ( while :; do date; sleep 5; don ...