Entity Framework Core 学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

参考:微软官网-第一个 EF-Core 应用

一、Entity Framework (EF) Core是什么?

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术
EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:
a. 使 .NET 开发人员能够使用 .NET 对象处理数据库
b. 无需再像通常那样编写大部分数据访问代码
EF Core 支持多个数据库引擎,请参阅数据库提供程序了解详细信息

二、快速开始

1.获取包管理器控制台工具

安装 Microsoft.EntityFrameworkCore.Tools 包,ASP.NET Core 应用自动随附此包

在这里插入图片描述

2.为目标对象的 EF Core 数据库提供程序安装程序包

ps: 这里我使用的是 Npgsql (公司使用 postgresql 数据库)
包:Npgsql.EntityFrameworkCore.PostgreSQL

在这里插入图片描述

3.添加模型类和数据库上下文

在这里插入图片描述

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }


    public BloggingContext(DbContextOptions<BloggingContext> options) : base(options)
    {

    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

4.配置连接字符串

在这里插入图片描述

/5.连接字符串
  "ConnectionStrings": {
    "BloggingContext": "User ID=postgres;Password=root;Host=localhost;Port=5432;Database=EFCoreDemo;CommandTimeout=1024;MaxPoolSize=1024"
  }

5.注册数据库上下文

在这里插入图片描述

//注册 BloggingContext
services.AddDbContext<BloggingContext>(options =>
    options.UseNpgsql(Configuration.GetConnectionString("BloggingContext")));
            

6.使用迁移创建数据库

a.Add-Migration InitialDB 命令为迁移搭建基架,以便为模型创建一组初始表
b.Update-Database 命令创建数据库并向其应用新的迁移

在这里插入图片描述

7.添加控制器

在这里插入图片描述
在这里插入图片描述

8.启动项目

在这里插入图片描述

9.测试接口

提示:使用 postman 进行测试,数据库 id 自增,可以不传递 id

在这里插入图片描述

三、DbContext 说明

1.依赖注入

使用 Startup.cs 的 ConfigureServices 方法中的 AddDbContext 将 EF Core 添加配置

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BloggingContext>(options =>
              options.UseNpgsql(Configuration.GetConnectionString("BloggingContext")));    
}

然后在控制器中通过构造函数进行依赖注入

public class MyController
{
    private readonly ApplicationDbContext _context;

    public MyController(ApplicationDbContext context)
    {
        _context = context;
    }
}

四、配置模型

1. 使用 fluent API 配置模型

a. 可在派生上下文中替代 OnModelCreating 方法,并使用 ModelBuilder API 来配置模型
b. 此配置方法最为有效,并可在不修改实体类的情况下指定配置
c. Fluent API 配置具有最高优先级,并将替代约定和数据注释(写在类上面的注释)

在这里插入图片描述

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     //给 Rating 列设置默认值
     modelBuilder.Entity<Blog>()
         .Property(b => b.Rating)
         .HasDefaultValue(3);
 }

tip: 需要更新迁移修改才生效
a. add-migration AddDefaultValue
b. update-database

在这里插入图片描述

tip: Migration 文件夹下生成的每次迁移,都是按照时间顺序排列的,所以你可以很方便的看到每一次对数据库结构做的修改信息

2. 分组配置

a. 为了减小 OnModelCreating 方法的大小,可以将实体类型的所有配置提取到实现 IEntityTypeConfiguration 的单独类中

在这里插入图片描述

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace EFCoreDemo.Models.Config
{
    //Blog 类的配置类
    public class BlogEntityTypeConfiguration : IEntityTypeConfiguration<Blog>
    {
        public void Configure(EntityTypeBuilder<Blog> builder)
        {
            //添加约束
            builder
                .Property(b => b.Url)
                .IsRequired();
        }
    }
}

b. 然后,只需从 OnModelCreating 调用 Configure 方法

在这里插入图片描述

//将实体类型的所有配置提取到实现 IEntityTypeConfiguration<TEntity> 的单独类中
            new BlogEntityTypeConfiguration().Configure(modelBuilder.Entity<Blog>());

c. 记得更新迁移,使得修改数据库操作生效 :
add-migration AddUrlRequired
update-database

在这里插入图片描述

3.使用数据注释来配置模型

tip: 数据注释可以应用于类和属性,但会被 Fluent API 配置替代,常用数据注释如下:

//使用数据注释
    [Table("Blogs")]
    [Comment("Blogs managed on the website")]
    public class Blog
    {
        [Column("blog_id")]
        //[Key] 将单个属性配置为实体的主键
        //组合键只能使用 Fluent API 进行配置
        public int BlogId { get; set; }

        [Required]
        [MaxLength(500)]
        [Column(TypeName = "varchar(200)")]
        public string Url { get; set; }


        //[DefaultValue(5)]
        public int Rating { get; set; }

        //针对插入的实体生成其值
        public DateTime Create { get; set; }

        public List<Post> Posts { get; } = new();
    }

tip: 记得更新迁移、更新数据库使之生效

4.日期时间

一个常见的请求是让数据库列包含第一次插入列的日期/时间(添加时生成的值)或上次更新列的日期/时间(添加或更新时生成的值)。 由于可通过各种策略执行此操作,因此 EF Core 提供程序通常不会为日期/时间列自动设置值生成 - 你必须自行配置

在这里插入图片描述

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Create)
        .HasDefaultValueSql("CURRENT_DATE");
}

在这里插入图片描述

tip: 更新迁移、数据库。。。
tip: 上面的 CURRENT_DATE 方法是针对 postgresql 数据库的,其他类型数据库自行尝试

五、管理数据库架构

1. 迁移

在实际项目中,数据模型随着功能的实现而变化:添加和删除新的实体或属性,并且需要相应地更改数据库架构,使其与应用程序保持同步。 EF Core 中的迁移功能能够以递增方式更新数据库架构,使其与应用程序的数据模型保持同步,同时保留数据库中的现有数据

简要地说,迁移的方式如下:

a. 当引入数据模型更改时,开发人员使用 EF Core 工具添加相应的迁移,以描述使数据库架构保持同步所需的更新。EF Core 将当前模型与旧模型的快照进行比较,以确定差异,并生成迁移源文件;文件可在项目的源代码管理中进行跟踪

b. 生成新的迁移后,可通过多种方式将其应用于数据库。 EF Core 在一个特殊的历史记录表中记录所有应用的迁移,使其知道哪些迁移已应用,哪些迁移尚未应用

使用步骤:

a. 安装程序包管理器控制台工具:Microsoft.EntityFrameworkCore.Tools
b. 创建迁移:Add-Migration InitialCreate
c. 创建数据库和架构:Update-Database
d. 列出现有的所有迁移:Get-Migration

六、查询数据

1. LINQ

Entity Framework Core 使用语言集成查询 (LINQ) 来查询数据库中的数据。 通过 LINQ 可使用 C#(或你选择的其他 .NET 语言)编写强类型查询。 它使用你派生得到的上下文和实体类来引用数据库对象。 EF Core 将 LINQ 查询的表示形式传递给数据库提供程序。 反过来,数据库提供程序将其转换为数据库特定的查询语言(例如,用于关系数据库的 SQL)。 即使结果中返回的实体已存在于上下文中,也始终对数据库执行查询

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值