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

    C# 数据操作系列 - 5. EF Core 入门_java

    点下一步,选择Console程序:

    C# 数据操作系列 - 5. EF Core 入门_java_02

    点击创建

  • 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

执行成功之后会在项目根目录下多出以下内容:

C# 数据操作系列 - 5. EF Core 入门_java_03

这是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并不只有这些。下一篇将介绍如何自定义映射关系。