第 5 章 使用 Entity Framework Core

5.1 Entity Framework Core

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

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

5.2 使用 EF Core

EF Core 有两种使用方式:

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

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

Scaffold-DbContext

代码优先,创建实体类

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 类

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 添加到容器中

services.AddDbContext<LibraryDbContext>(option =>
{
option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
});

使用 UseSqlServer 之前需要添加引用

Install-Package Microsoft.EntityFrameworkCore.SqlServer

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

"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=LibraryAPI;Trusted_Connection=True;MultipleActiveResultSets=true"
}

添加引用

Install-Package Microsoft.EntityFrameworkCore.Design

添加迁移与创建数据库

dotnet ef migrations add InitialCreation

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

更新一波 EF Core tools

dotnet tool update --global dotnet-ef

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

dotnet ef database update

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

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

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"
});
}

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

dotnet ef migrations add SeedData

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

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"));
}
}
}

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

dotnet ef database update

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

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

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

dotnet ef migrations remove

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

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

  1. 使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...

  2. 4类Storage方案(AS开发实战第四章学习笔记)

    4.1 共享参数SharedPreferences SharedPreferences按照key-value对的方式把数据保存在配置文件中,该配置文件符合XML规范,文件路径是/data/data/应 ...

  3. 菜单Menu(AS开发实战第四章学习笔记)

    4.5 菜单Menu Android的菜单主要分两种,一种是选项菜单OptionMenu,通过按菜单键或点击事件触发,另一种是上下文菜单ContextMenu,通过长按事件触发.页面的布局文件放在re ...

  4. [Android]《Android艺术开发探索》第一章读书笔记

    1. 典型情况下生命周期分析 (1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart方法就会被调用. (2)当用户打开新的Activity或者切换到桌面的时候,回调如下 ...

  5. 温故知新,使用ASP.NET Core创建Web API,永远第一次

    ASP.NET Core简介 ASP.NET Core是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用. 使用ASP.NET Core,您可以: 生成Web应用和服务.物联 ...

  6. 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践

    本节内容,涉及到6.1-6.6(P155-182),以WebApi说明为主.主要NuGet包:无 一.创建WebApi的最佳实践,综合了RPC和Restful两种风格的特点 1 //定义Person类 ...

  7. 零基础ASP.NET Core WebAPI团队协作开发

    零基础ASP.NET Core WebAPI团队协作开发 相信大家对“前后端分离”和“微服务”这两个词应该是耳熟能详了.网上也有很多介绍这方面的文章,写的都很好.我这里提这个是因为接下来我要分享的内容 ...

  8. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  9. 从 0 使用 SpringBoot MyBatis MySQL Redis Elasticsearch打造企业级 RESTful API 项目实战

    大家好!这是一门付费视频课程.新课优惠价 699 元,折合每小时 9 元左右,需要朋友的联系爱学啊客服 QQ:3469271680:我们每课程是明码标价的,因为如果售价为现在的 2 倍,然后打 5 折 ...

  10. Asp.Net Core 5 REST API - Step by Step

    翻译自 Mohamad Lawand 2021年1月19日的文章 <Asp.Net Core 5 Rest API Step by Step> [1] 在本文中,我们将创建一个简单的 As ...

随机推荐

  1. S3C2440移植uboot之支持烧写yaffs映像及制作补丁

      上一节S3C2440移植uboot之裁剪和修改默认参数裁剪了uboot,修改了默认的参数,这一节开始制作yaffs映像以及补丁文件 目录 烧写文件系统 分析源码 烧写yaffs试验 使用part制 ...

  2. Vue中如何使用sass实现换肤(更换主题)功能

    Vue中如何使用sass实现换肤(更换主题)功能 https://blog.csdn.net/m0_37792354/article/details/82012278

  3. 使用 Sealos 将 ChatGLM3 接入 FastGPT,打造完全私有化 AI 客服

    FastGPT 是一款专为客服问答场景而定制的开箱即用的 AI 知识库问答系统.该系统具备可视化工作流功能,允许用户灵活地设计复杂的问答流程,几乎能满足各种客服需求. 在国内市场环境下,离线部署对于企 ...

  4. java进阶(20)--final/fianlly/fianlize区别

    1.final关键字.表示最终的.不变的 final修饰的类无法继承 final修饰的方法无法覆盖 final修饰的变量不能重新赋值 举例: final double weight; 2.finall ...

  5. java基础(15)--多态

    一.多态的含义 1.多种形态.多种状态,指的是编译与运行有不同的状态 2.编译时->静态绑定 3.执行时->动态绑定 4.多类典型场景:父类的引用指向了子类型的对象   二.向下转型与向上 ...

  6. 机器学习-决策树系列-GBDT算法-集成学习-30

    目录 1. 复习 2. GBDT 3. gbdt应用于二分类: 3. gbdt应用于多类 4. 叶子节点输出值c的计算 5. GBDT的其他应用 6. GBDT+LR 代码实现 1. 复习 再开始学习 ...

  7. Java之利用openCsv将csv文件导入mysql数据库

    前两天干活儿的时候有个需求,前台导入csv文件,后台要做接收处理,mysql数据库中,项目用的springboot+Vue+mybatisPlus实现,下面详细记录一下实现流程. 1.Controll ...

  8. SoC scan implementation

    scan chain产生之前需要进行scan drc的过程,判断cell是不是能够串到scan chain上去 mux-d scan cell(是最常用的scan cell),还有其他的scan ce ...

  9. 2023年江苏“领航杯”MISC一个很有意思的题目(别把鸡蛋放在同一个篮子里面)

    别把鸡蛋放在同一个篮子里面 题目附件:https://wwzl.lanzoue.com/i6HmX16finnc 1.题目信息 解压压缩包打开附件,获得5141个txt文档,每个文档都有内容,发现是b ...

  10. JMS微服务开发示例(五)生成短token,实现用户无状态登录

    用户token,也可以利用第三方框架生成,JMS也包含了自己的token服务器. 部署TokenServer 到这里下载 tokenserver.zip,然后部署运行TokenServer. 微服务中 ...