Entity Framework Core(简称EFCore)是微软官方为.Net平台设计的全功能ORM框架,EFCore是.Net平台的一部分,用于编写应用程序的数据访问层代码。在早期.Net Framework时代我们可能使用过Entity Framework(简称EF),EFCore则是.Net Core下的实现。
官方文档:https://learn.microsoft.com/en-us/ef/core/
除了EFCore,.Net平台下ORM框架的另一个选择是Dapper(由StackOverflow公司开发),Dapper和EFCore的关系可以类比于Java领域的MyBatis和Hibernate(JPA),Dapper是一个超轻量级的半自动ORM框架,它实现的功能简单来说就是执行SQL语句并将查询结果映射到C#对象上,而EFCore是全功能ORM框架,这是两者的区别。
实际开发中我们应该根据具体应用场景来选择使用Dapper或是EFCore,对于一些复杂的业务系统、管理后台等推荐使用EFCore,全功能ORM框架能够简化这类程序的数据访问层代码编写;而对于那些强烈要求使用Database First开发模式的应用,应该选择Dapper。
Model First(弃用):该开发模式中,首先使用可视化工具(如Entity Framework Designer等)设计数据模型,然后使用工具生成数据库架构并迁移到数据库中。
Database First:该开发模式通常使用一个现有的数据库,EFCore中可以使用Scaffold-DbContext
工具从数据库中生成实体类代码。
Code First:该开发模式需要开发人员先编写实体类代码,EFCore会根据实体类生成数据迁移,我们执行数据迁移来创建数据库。
实际开发中,在EFCore里我们应该尽量使用Code First开发模式。
这里我们以.Net6和MySQL数据库为例,通过一些简单的例子演示EFCore框架的用法。
执行以下命令使用NuGet安装EFCore和MySQL相关的支持。
Install-Package Microsoft.EntityFrameworkCore -Version 6.0.22
Install-Package Microsoft.EntityFrameworkCore.Tools -Version 6.0.22
Install-Package Pomelo.EntityFrameworkCore.MySql -Version 6.0.2
其中,Microsoft.EntityFrameworkCore
是EFCore框架本体;Microsoft.EntityFrameworkCore.Tools
包含一些命令行工具,用于生成和应用数据迁移;Pomelo.EntityFrameworkCore.MySql
是MySQL数据库对EFCore的支持库,注意这个库并非MySQL官方提供,而是由社区提供的开源项目,pomelo(柚子)是一个很小的开源组织,但他们编写了几个.Net下实用的开源库得到了开发者的广泛使用。
安装完成后,我们就可以在项目中使用EFCore了。
这里我们编写的模型为Student
类,其中包含了若干字段。
Student.cs
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Gacfox.Demo.DemoNetCore;
[Table("t_student")]
public class Student
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("student_id")]
public long StudentId { get; set; }
[Required]
[Column("student_name")]
public string StudentName { get; set; }
[Required]
[Column("age")]
public int Age { get; set; }
[Required]
[Column("create_time")]
public DateTime CreateTime { get; set; }
}
代码中我们通过Attribute配置了模型对应的表名以及模型字段对应的数据库字段名,此外还对主键、字段长度限制、是否可为空值等进行了配置。
MyDbContext.cs
代码中,我们继承了DbContext
类,它用于对数据库连接和一些模型的全局配置规则进行配置。
MyDbContext.cs
using Microsoft.EntityFrameworkCore;
namespace Gacfox.Demo.DemoNetCore;
public class MyDbContext : DbContext
{
public DbSet<Student> Students { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
const string connStr = "Server=localhost;Port=3306;Database=netstore;User=root;Password=root;";
optionsBuilder.UseMySql(connStr, ServerVersion.AutoDetect(connStr));
}
}
代码中我们重写了OnConfiguring()
方法,在其中我们配置了MySQL数据库的连接字符串。
此时我们打开Visual Studio的「程序包管理器控制台」,在其中执行以下命令。
Add-Migration init
Add-Migration
命令后面的init
是我们自己起的名字,这个名字的作用类似Git提交代码时的说明,主要用于简短描述这次数据迁移修改了哪些内容,我们实际开发中可以自己定义。该命令执行完成后,我们会发现在代码中生成了一个Migrations
目录,其中包含了执行数据迁移的C#代码。
此时我们可以执行以下命令应用数据迁移到数据库。
Update-Database
执行数据迁移后,我们可以观察到数据库中已经建好数据表了。
下面我们以一个简单的插入为例,演示如何使用EFCore操作数据库中的数据。
Program.cs
namespace Gacfox.Demo.DemoNetCore;
public class Program
{
public static void Main()
{
using (MyDbContext myDbContext = new MyDbContext())
{
Student s1 = new Student { StudentName = "汤姆", Age = 18, CreateTime = DateTime.Now };
myDbContext.Students.Add(s1);
myDbContext.SaveChanges();
}
}
}
代码中,我们首先创建了一个模型的实例对象并设置了其中的属性,然后我们调用myDbContext.Students.Add()
方法表示我们要执行插入数据的操作,最后我们调用myDbContext.SaveChanges()
保存修改,此时我们可以观察到数据被插入到了数据库中。