.NET-EF Core

.NET-EF Core

同Java的Mybatis相同,EF Core(Entity Framework Core)是.NET的ORM框架

区别是:

  • EF Core是模型驱动(Model-Driven)的开发思想

  • MyBatis是数据库驱动(DataBase-Driven)的开发思想

.NET的第三方ORM框架Dapper,就是很相似MyBatis的数据库驱动框架

然而,因为EF Core是模型驱动的开发思想,所以我们不用直接写Sql语句,由框架帮我们完成LINQ与SQL的转换

但每一个数据库的SQL不是完全相同的,这时,我们除了需要EF Core框架本身,还需要一些官方或第三方提供的Provider去完成针对某一数据库具体的实现


PostgreSQL

EF Core支持三大非关系型数据库的使用

  • MySQL
  • SqlServer
  • PostgreSQL

而公司中使用的是Pg数据库,所以我们以此展开EF Core的学习

依赖导入

Npgsql.EntityFrameworkCore.PostgreSQL

Microsoft.EntityFrameworkCore(依赖传递)


Migration

代码优先(Code first)是一种技术,可以帮助我们通过代码来创建数据库,迁移和维护数据库及其表

也就意味着我们可以通过.NET代码直接维护数据库及其对应的表

当尚未准备好数据库并且想要在新项目中创建数据库并直接通过代码维护数据库时,这将是个很好的选择

因为在理想状态下,程序员无需关心数据库的操作

依赖安装

Microsoft.EntityFrameworkCore.Tools

在控制台中执行

dotnet ef migrations add init

add-migration (程序包管理控制台)

注:Rider没有程序包管理控制台,需要使用普通控制台cd到项目文件夹下使用dotnet ef来执行tools的工具

执行完之后,项目中会多出Migrations文件夹和一些创建数据库表的c#代码

在控制台执行

dotnet ef database update

update-database (程序包管理控制台)

在开发过程中,根据需要,可能会在已有实体中增删改表中的列

就要先执行migrations add,填入更新命名,在执行database update推送到数据库即可

一些其他命令
命令功能
Update-Datebase XXX把数据库回滚到XXX之前的状态(迁移脚本不动)
Remove-Migration删除最后一次的迁移脚本
Script-Migration生成迁移SQL代码
Script-Migration D F根据迁移脚本D-F来生成SQL代码

在生产环境中,不建议使用Update-Datebase命令去更新数据库,更推荐使用Script-Migration获得SQL后手动更新数据库


IEntityTypeConfiguration&DbContext

IEntityTypeConfiguration

实现IEntityTypeConfiguration,为指定实体类配置具体参数

在Configure方法中,使用EntityTypeBuilder<T>可以设置实体类的属性(表中列)的约束和长度等参数

public class BookConfig:IEntityTypeConfiguration<Book>
{
    public void Configure(EntityTypeBuilder<Book> builder)
    {
        // 创建与表的映射关系
        builder.ToTable("Books");
        // 配置book表中书名长度最大为50,且为必填项
        builder.Property(b => b.Title).HasMaxLength(50).IsRequired();
    }
}

然而,在EF Core中,配置类并不是强制存在的,是可以缺省的

  1. 默认配置足够满足需求

EF Core 提供了许多默认的配置规则,这些规则通常已经能够满足大多数简单的实体映射需求。例如:

  • 主键:EF Core 会自动将名为 Id<实体名>Id 的属性识别为主键。
  • 属性映射:所有公共属性都会被自动映射到数据库列。
  • 关系:通过导航属性和外键属性,EF Core 可以自动推断出实体之间的关系。
  1. 简化代码

对于简单的实体模型,使用默认配置可以大大简化代码,减少不必要的配置类和方法。这样可以使代码更加简洁和易读。

  1. 快速原型开发

在快速原型开发或小项目中,使用默认配置可以快速启动和运行项目,而不需要花费时间在详细的配置上。

  1. 高级配置按需进行

如果在项目开发过程中发现需要更复杂的配置,可以随时添加配置类

例如,当需要配置索引、唯一约束、表名等高级特性时,再引入 IEntityTypeConfiguration 配置类也不迟,这也是约定大于配置的一种体现


DbContext

继承DbContext,为配置类注册

在OnConfiguring方法中,我们可以完成对数据库四大件的配置

在OnModelCreating方法中,我们可以对上面的配置文件进行注册

public class MyDbContext : DbContext
{
    // 定义 DbSets,用于访问和操作数据库中的表
    public DbSet<Book> Books { get; set; }
    public DbSet<Person> Persons { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
        // 填写数据库四大件
        optionsBuilder.UseNpgsql(@"Host=172.16.22.222;Username=postgres;Password=synyi;Database=bai_study");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        // 从当前类的程序集中加载所有的IEntityTypeConfiguration
        modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        // 注册BookConfig配置文件
        modelBuilder.ApplyConfiguration(new BookConfig());
    }
}