EFCore简介

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的特性

  1. 跨平台:EFCore是跨平台的,可以在Windows、Linux、macOS上运行。
  2. 多数据库支持:EFCore支持MySQL、PostgreSQL、SQLite等流行的关系型数据库系统,EFCore致力于帮我们屏蔽这些数据库底层的细节。
  3. 支持数据迁移:EFCore能自动根据模型定义生成数据库迁移脚本,无需手动编写SQL脚本创建和修改数据表。
  4. 支持LINQ:EFCore支持LINQ查询语言来编写和执行数据库查询,查询操作更加直观和类型安全。
  5. 支持异步:EFCore支持异步数据库操作,能够轻松实现高并发程序。

除了EFCore,.Net平台下ORM框架的另一个选择是Dapper(由StackOverflow公司开发),Dapper和EFCore的关系可以类比于Java领域的MyBatis和Hibernate(JPA),Dapper是一个超轻量级的半自动ORM框架,它实现的功能简单来说就是执行SQL语句并将查询结果映射到C#对象上,而EFCore是全功能ORM框架,这是两者的区别。

实际开发中我们应该根据具体应用场景来选择使用Dapper或是EFCore,对于一些复杂的业务系统、管理后台等推荐使用EFCore,全功能ORM框架能够简化这类程序的数据访问层代码编写;而对于那些强烈要求使用Database First开发模式的应用,应该选择Dapper。

EF中的3种开发模式

Model First(弃用):该开发模式中,首先使用可视化工具(如Entity Framework Designer等)设计数据模型,然后使用工具生成数据库架构并迁移到数据库中。

Database First:该开发模式通常使用一个现有的数据库,EFCore中可以使用Scaffold-DbContext工具从数据库中生成实体类代码。

Code First:该开发模式需要开发人员先编写实体类代码,EFCore会根据实体类生成数据迁移,我们执行数据迁移来创建数据库。

实际开发中,在EFCore里我们应该尽量使用Code First开发模式。

EFCore使用简介

这里我们以.Net6和MySQL数据库为例,通过一些简单的例子演示EFCore框架的用法。

安装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配置了模型对应的表名以及模型字段对应的数据库字段名,此外还对主键、字段长度限制、是否可为空值等进行了配置。

创建DbContext类

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()保存修改,此时我们可以观察到数据被插入到了数据库中。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap