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 并不只有这些。下一篇将介绍如何自定义映射关系。
更多内容烦请关注我的博客《高先生小屋》