前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《ASP.ENT Core 与 RESTful API 开发实战》-- (第5章)-- 读书笔记(上)

《ASP.ENT Core 与 RESTful API 开发实战》-- (第5章)-- 读书笔记(上)

作者头像
郑子铭
发布2021-01-13 15:42:53
1.1K0
发布2021-01-13 15:42:53
举报

第 5 章 使用 Entity Framework Core

5.1 Entity Framework Core

EF Core 是微软推出的 ORM 框架,一种为了解决高级编程语言中的对象和关系型数据库之间映射关系的技术,它能够将程序中的对象自动持久化到关系型数据库中,并能够将数据库中的数据信息自动映射到编程语言中的对象

EF Core 的另一个特点是支持 LINQ,通过 LINQ,我们能够像操作 .NET 集合对象中的数据一样来操作数据库中存储的数据

5.2 使用 EF Core

EF Core 有两种使用方式:

  • 代码优先:根据先创建好的实体类来创建数据库和表
  • 数据库优先:根据先创建好的数据库以及其中的数据表来生成与之匹配的实体类

创建一个新项目时,通常建议使用“代码优先”的方法,如果使用“数据库优先”,可以通过以下命令生成数据库对应代码

代码语言:javascript
复制
Scaffold-DbContext

代码优先,创建实体类

代码语言:javascript
复制
namespace Library.API.Entities
{
    public class Author
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }

        [Required]
        [MaxLength(20)]
        public string Name { get; set; }

        [Required]
        public DateTimeOffset BirthData { get; set; }

        [Required]
        [MaxLength(40)]
        public string BirthPlace { get; set; }

        [Required]
        [EmailAddress]
        public string Email { get; set; }

        public ICollection<Book> Books { get; set; } = new List<Book>();
    }
}

namespace Library.API.Entities
{
    public class Book
    {
        [Key]
        public Guid Id { get; set; }

        [Required]
        [MaxLength(100)]
        public string Title { get; set; }

        [MaxLength(500)]
        public string Description { get; set; }

        public int Pages { get; set; }

        [ForeignKey("AuthorId")]
        public Author Author { get; set; }

        public Guid AuthorId { get; set; }
    }
}

创建 DbContext 类

代码语言:javascript
复制
using Microsoft.EntityFrameworkCore;

namespace Library.API.Entities
{
    public class LibraryDbContext : DbContext
    {
        public DbSet<Author> Authors { get; set; }
        public DbSet<Book> Books { get; set; }
        
        /// <summary>
        /// 添加构造函数之后才可以注入容器
        /// </summary>
        /// <param name="options"></param>
        public LibraryDbContext(DbContextOptions<LibraryDbContext> options) : base(options)
        {

        }
    }
}

在 ConfigureServices 方法中将 LibraryDbContext 添加到容器中

代码语言:javascript
复制
services.AddDbContext<LibraryDbContext>(option =>
{
    option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
});

使用 UseSqlServer 之前需要添加引用

代码语言:javascript
复制
Install-Package Microsoft.EntityFrameworkCore.SqlServer

在 appsettings.json 文件的一级节点下增加配置

代码语言:javascript
复制
"ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=LibraryAPI;Trusted_Connection=True;MultipleActiveResultSets=true"
  }

添加引用

代码语言:javascript
复制
Install-Package Microsoft.EntityFrameworkCore.Design

添加迁移与创建数据库

代码语言:javascript
复制
dotnet ef migrations add InitialCreation

上述命令成功执行之后项目中多了一个文件夹 Migrations,包含本次迁移

更新一波 EF Core tools

代码语言:javascript
复制
dotnet tool update --global dotnet-ef

接着将迁移应用到数据库中

代码语言:javascript
复制
dotnet ef database update

命令执行成功之后,数据库就创建成功了

添加测试数据,在 LibraryDbContext 中重载 OnModelCreating 方法

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<Author>().HasData(
        new Author
        {
            Id = Guid.NewGuid(),
            Name = "Author",
            BirthData = new DateTimeOffset(new DateTime(1960, 11, 18)),
            BirthPlace = "广东汕头",
            Email = "author@xxx.com"
        });
}

要让这些数据添加到数据库中,还应创建一个迁移

代码语言:javascript
复制
dotnet ef migrations add SeedData

执行成功之后,自动生成迁移文件,以 _SeedData 结尾,在 Up 方法中向数据库添加数据

代码语言:javascript
复制
namespace Library.API.Migrations
{
    public partial class SeedData : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.InsertData(
                table: "Authors",
                columns: new[] { "Id", "BirthData", "BirthPlace", "Email", "Name" },
                values: new object[] { new Guid("2d149469-c630-41fa-98f1-226f50534fbc"), new DateTimeOffset(new DateTime(1960, 11, 18, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)), "广东汕头", "author@xxx.com", "Author" });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DeleteData(
                table: "Authors",
                keyColumn: "Id",
                keyValue: new Guid("2d149469-c630-41fa-98f1-226f50534fbc"));
        }
    }
}

接着将迁移应用到数据库中

代码语言:javascript
复制
dotnet ef database update

命令执行成功之后,可以看到新添加的数据

如果要删除测试数据,可以注释添加测试数据的代码,并添加一个迁移即可

如果添加数据是最近的一次迁移操作,并且还未执行数据库更新命令,可以直接通过以下命令删除该迁移

代码语言:javascript
复制
dotnet ef migrations remove

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第 5 章 使用 Entity Framework Core
    • 5.1 Entity Framework Core
      • 5.2 使用 EF Core
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档