ASP.NET Core 3.1系列(15)——Entity Framework Core之DB First

news2024/11/25 15:44:30

1、前言

本文开始介绍一些关于Entity Framework Core的内容。在EFCore中,常用的为DB First模式和Code First模式,下面就来介绍一下如何在EFCore中使用DB First模式生成实体类和数据库上下文。

2、创建测试数据库

SQL Server中新建一个数据库Dao,执行如下语句,创建CountryProvince数据表。

USE [Dao]
GO

/****** Object:  Table [dbo].[Country]    Script Date: 2022/11/30 8:52:23 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Country](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[CountryName] [nvarchar](20) NULL,
 CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
USE [Dao]
GO

/****** Object:  Table [dbo].[Province]    Script Date: 2022/11/30 8:53:00 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Province](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[ProvinceName] [nvarchar](20) NULL,
 CONSTRAINT [PK_Province] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

运行结果如下图所示:

在这里插入图片描述

3、引入EFCore相关组件

创建一个Web API项目,使用NuGet引入如下四个组件,这里全部选择3.1.31版本:

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools

在这里插入图片描述

4、生成实体类和数据库上下文

EFCore中,使用DB First模式生成实体类和数据库上下文时需要使用Scaffold-DbContext命令,该命令的格式如下所示:

Scaffold-DbContext [-Connection] <String> [-Provider] <String> [-OutputDir <String>] [-ContextDir <String>] [-Context <String>] [-Schemas <String[]>] [-Tables <String[]>] [-DataAnnotations] [-UseDatabaseNames] [-Force] [-Project <String>] [-StartupProject <String>][<CommonParameters>]

Scaffold-DbContext命令中的参数说明如下表所示:

名称含义
-Connection指定数据库的连接字符串
-Provider指定要使用的提供程序。例如Microsoft.EntityFrameworkCore.SqlServer
-OutputDir指定用于输出类的目录。如果省略,则使用顶级项目目录
-ContextDir指定存放DbContext的目录
-Context指定生成的DbContext类的名称
-Schemas指定要为其生成类的模式
-Tables指定要为其生成类的表
-DataAnnotations使用DataAnnotation属性在可能的情况下配置模型
-Force强制脚手架覆盖现有文件
-Project指定实体类和数据库上下文存放在的项目名称
-StartupProject指定启动项目名称

打开NuGet控制台,输入如下命令:

Scaffold-DbContext -Connection "Data Source=DSF-PC;Initial Catalog=Dao;User ID=sa;Password=123456;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir Context -Context DaoDbContext

运行结果如下图所示,可以发现已经创建了实体类CountryProvince和数据库上下文类DaoDbContext。到此为止,我们已经可以通过Scaffold-DbContext命令生成实体类和数据库上下文了。

在这里插入图片描述

5、Scaffold-DbContext命令中一些参数的含义及作用

在上面的代码中,我们对Scaffold-DbContext命令中的一些关键参数进行了设置:

  • -OutputDir Models:存放实体类的文件夹名称为Models
  • -ContextDir Context:存放数据库上下文的文件夹名称为Context
  • -Context DaoDbContext:数据库上下文的名称为DaoDbContext

其实Scaffold-DbContext命令中还包括一些很有用的其他参数,下面举例说明。

5.1、只对数据库中的某些表生成实体类该怎么做?

在某些情况下,我们并不希望数据库中所有的表都生成实体类,而是只将某些需要的表生成实体类即可,此时就需要对-Tables参数进行设置,下面的代码只对Country表生成实体类,而Province表则不生成实体类。

Scaffold-DbContext -Connection "Data Source=DSF-PC;Initial Catalog=Dao;User ID=sa;Password=123456;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir Context -Context DaoDbContext -Tables "Country"

在这里插入图片描述

5.2、如何生成实体类字段的数据注解?

当前的实体类字段并不包含数据注解,如下图所示:

在这里插入图片描述
在这里插入图片描述
如果需要生成数据注解,只需要添加一个-DataAnnotations参数即可,代码如下:

Scaffold-DbContext -Connection "Data Source=DSF-PC;Initial Catalog=Dao;User ID=sa;Password=123456;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir Context -Context DaoDbContext -DataAnnotations

可以发现实体类字段已经生成了对应的数据注解。

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

5.3、数据库被修改后如何更新实体类和数据库上下文?

当前工程中的实体类和数据库上下文如下图所示:

在这里插入图片描述
下面对数据库进行一些修改。首先在Dao数据库中新增一张City表,代码如下:

USE [Dao]
GO

/****** Object:  Table [dbo].[City]    Script Date: 2022/11/30 9:30:54 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[City](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[CityName] [nvarchar](20) NULL,
	[CreateTime] [datetime] NULL,
 CONSTRAINT [PK_City] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

在这里插入图片描述
然后在Country表和Province表中新增一个字段CreateTime,代码如下:

alter table Country add [CreateTime] datetime null
alter table Province add [CreateTime] datetime null

在这里插入图片描述
现在对数据库的修改已经完成,下面就需要对实体类和数据库上下文进行更新了,我们只需要在Scaffold-DbContext命令后面加上-Force参数即可,它可以帮助我们重新生成实体类和数据库上下文并覆盖原有文件。

Scaffold-DbContext -Connection "Data Source=DSF-PC;Initial Catalog=Dao;User ID=sa;Password=123456;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir Context -Context DaoDbContext -DataAnnotations -Force

可以发现覆盖后的文件已经新增了City实体类,CountryProvince实体类也都新增了CreateTime字段。

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

5.4、分层项目中如何在其他类库中生成实体类和数据库上下文?

在实际开发过程中,很多项目都会进行分层操作,例如新建一个App.Models类库用来存放实体类和数据库上下文,如下图所示:

在这里插入图片描述
如果想在App.Models类库中生成实体类和数据库上下文也很简单,只需要按照如下步骤操作即可,首先在App.Models中使用NuGet引入EFCore的相关组件,如下所示:

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools

然后生成一下解决方案:

在这里插入图片描述
最后在Scaffold-DbContext命令中设置-Project-StartupProject参数,代码如下:

Scaffold-DbContext -Connection "Data Source=DSF-PC;Initial Catalog=Dao;User ID=sa;Password=123456;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir Context -Context DaoDbContext -DataAnnotations -Force -Project App.Models -StartupProject App.Models

可以发现在App.Models项目中已经生成了实体类和数据库上下文。

在这里插入图片描述

6、注入数据库上下文

现在实体类和数据库上下文都有了,接下来只需要在Controller中将其注入即可。首先在appsettings.json文件中配置数据库连接字符串,代码如下:

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*",
    "ConnectionStrings": {
        "ConnectionString": "Data Source=DSF-PC;Initial Catalog=Dao;User ID=sa;Password=123456;"
    }
}

然后在Startup.cs文件中添加数据库上下文,代码如下所示:

using App.Context;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace App
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // 添加控制器
            services.AddControllers();

            // 添加数据库上下文
            services.AddDbContext<DaoDbContext>(options =>
            {
                options.UseSqlServer(Configuration.GetConnectionString("ConnectionString"));
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

最后新建一个控制器CountryController.cs,将DaoDbContext注入即可,代码如下:

using App.Context;
using App.Models;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class CountryController : ControllerBase
    {
        protected readonly DaoDbContext _dbContext;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dbContext"></param>
        public CountryController(DaoDbContext dbContext)
        {
            _dbContext = dbContext;
        }

        /// <summary>
        /// 添加实体集合
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult<string> Add()
        {
            List<Country> list = new List<Country>
            {
                new Country { CountryName = "中国" },
                new Country { CountryName = "美国" },
                new Country { CountryName = "俄罗斯" }
            };
            _dbContext.Set<Country>().AddRange(list);
            _dbContext.SaveChanges();
            return "添加实体成功";
        }

        /// <summary>
        /// 获取实体集合
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult<List<Country>> Get()
        {
            return _dbContext.Set<Country>().ToList();
        }
    }
}

执行Add方法后,运行结果如下图所示:

在这里插入图片描述
执行Get方法后,运行结果如下图所示:

在这里插入图片描述

7、结语

本文主要介绍了一些关于EFCoreDB First开发模式的内容,对于Scaffold-DbContext命令中其他的参数含义及作用,有兴趣的同志也可以自行深入研究。如果你参与的项目之前就已经存在数据库,那么选用DB First模式可能会更加方便友好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2016-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧

本系列博客合计 21 篇&#xff0c;每篇都将解析一张《信息资源管理》真卷&#xff0c;并附带答案解析与背诵技巧。 全国 2016 年 4 月自学考试信息资源管理试题&#xff08;02378&#xff09; 单选题 1、按信息表现形式划分&#xff0c;信息可分为&#xff08;C&#xff09; …

JavaScript的Web api接口

JavaScript的Web api 文章目录JavaScript的Web api选中元素事件操作元素获取/元素内容获取/修改元素属性获取/修改表单元素属性实现一个显示/隐藏 密码的功能实现一个加减计算器复选框全选/全不选获取/修改样式属性点击文字放大字体实现白天模式与夜间模式的切换操作节点新增节…

【附源码】计算机毕业设计JAVA住房公积金筹集子系统的网站系统

【附源码】计算机毕业设计JAVA住房公积金筹集子系统的网站系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

3D漫游:所见即所得的形式,构建线上数字展厅

企业在数字化转型的大环境下&#xff0c;较为常用的当属数字展厅了&#xff0c;数字展厅能够为企业、行业协会、展销基地以及体验中心助力&#xff0c;以所见即所得的形式构建线上数字空间&#xff0c;满足企业的数字化展示和数字化营销。3D漫游&#xff0c;更加沉浸式的三维空…

使用 Hibernate Envers 进行实体审计

业务应用程序中的常见要求是在特定数据更改时存储版本控制信息;当某事发生变化时&#xff0c;谁改变了它&#xff0c;改变了什么。在这篇博文中&#xff0c;我们将介绍Hibernate Envers&#xff0c;它是Hibernate JPA库的一个组件&#xff0c;它为实体类提供了一个简单的审计/版…

【Linux网络配置实战】服务器Network静态路由配置

【Linux网络配置实战】服务器Network静态路由配置一、环境介绍1.环境规划2.实验目的二、检查各节点IP地址1.检查server01服务器上2.检查server02服务器网卡3.检查route01上的网卡三、在route01上启动IP包转发四、查看当前两节点互通情况1.查看server01和server02连通状态2.查看…

新手小白可以做什么互联网项目,副业项目应该怎么选择

现在网上的信息这么冗杂&#xff0c;有没有可靠的副业项目呢&#xff1f;怎样才能找到适合自己的副业呢&#xff1f; 说实话&#xff0c;在网上找副业并不难&#xff0c;搜索一下就会出来很多&#xff0c;但新手小白不知道如何选择&#xff0c;导致焦虑&#xff0c;一个重要的…

helm2.0安装及部署

一、helm简介 Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart&#xff0c;一个Chart是一个目录&#xff08;一般情况下会将目录进行打包压缩&#xff0c;形成name-version.tgz格式的单一文件&#xff0c;方便传输和存储&#xff09…

Linux 如何设置代理

安装部署 clash 是一款用 Go 语言开发的软件&#xff0c;所以我可以直接下载预编译的版本进行部署。 下载地址&#xff1a;https://github.com/Dreamacro/clash/releases/download/v1.8.0/clash-linux-amd64-v1.8.0.gz软件的作者提供了多种架构下预编译的二进制文件&#xff0…

67 - 经典问题解析五(指针的判别 构造中的异常)

---- 整理自狄泰软件唐佐林老师课程 1. 问题一 编写程序判断一个变量是不是指针&#xff1f; 1.1 指针的判别 C中仍然支持C语言中的可变参数函数C编译器的 匹配调用 优先级&#xff1a;重载函数 > 函数模板 > 变参函数 #include <iostream> #include <strin…

16-JavaSE基础巩固项目:拼图小游戏

阶段项目-拼图小游戏 一、项目介绍 1、目的 锻炼逻辑思维能力&#xff0c;让我们知道前面学习的知识点在实际开发中的应用场景。 1、为了学习一个新知识&#xff1a;GUI GUI全称&#xff1a;Graphical User Interface&#xff08;又称图形用户接口&#xff09;是指采用图形化…

三维地质建模数据处理

三维地质建模计算在地质工程、地球物理、矿产勘查等领域获得了广泛的应用&#xff0c;常用软件包括GOCAD、Surpac、XModel、DMine等。通过三维地质建模&#xff0c;既可以表达空间几何对象&#xff0c;也可以表现空间属性分布&#xff0c;进而实现地下三维空间可视化、地质解释…

win11 L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误

连接公司内网遇到的问题。。。。修改了&#xff08;不是翻墙&#xff0c;审核一下&#xff09; 在所有情况之前先尝试用手机热点试一下&#xff0c;排除网络问题&#xff0c; 今天遇到就移动的热点WiFi登不上公司内网&#xff0c;电信联通都行 所以先试试换个运营商热点看看…

springboot项结构分析

三. SpringBoot 结构 3.1.SpringBoot 工作原理 Spring boot应用程序采用各种Starters启动器,入口类是包含SpringBootApplication注解和main方法的类,然后使用ComponentScan注解自动扫描项目中的所有组件,并且Spring Boot会根据EnableAutoConfiguration注解将项目中的依赖项自…

redis基础1——发展历程+源码安装及配置+基本常识

文章目录一、NOSQL概述1.1 单机Mysql的演进1.2 什么是Nosql1.3 Nosql的四大分类1.3.1 KV键值对型1.3.2 文档型数据库&#xff08;bson格式&#xff0c;和json一样&#xff09;1.3.3 列存储数据库1.3.4 图数据库二、redis安装与配置2.1 redis概述2.2 Windows安装2.2.1 安装至win…

【项目实战:核酸检测平台】第四章 冲锋陷阵

项目实战&#xff1a;核酸检测平台第四章 冲锋陷阵 摘要&#xff1a;战争&#xff0c;冲在最前面的永远是最危险的人群&#xff0c;新冠之战&#xff0c;冲在最前的则是医护人员、防疫工作者。 核酸检测平台的采集人员APP做为先头部队的重要武器&#xff0c;一定要做的好用、…

JVM之运行时数据区 PC、虚拟机栈、本地方法栈

JVM之运行时数据区 PC、虚拟机栈、本地方法栈PC寄存器线程回顾寄存器实践面试使用PC寄存器存储字节码指令地址有什么用&#xff1f;为什么使用PC寄存器记录当前线程的执行地址PC寄存器为什么会被设定为线程私有虚拟机栈虚拟机栈出现背景简介栈可能出现的异常栈中存储着什么运行…

二、【redux】redux 完整版求和Demo

文章目录1、添加count_action.js1.1、项目结构变化1.2、CODE1.2.1、count_action.js1.2.2、Count_Redux.jsx2、添加constant.js2.1、项目结构变化2.2、CODE2.2.1、constant.js2.2.2、count_action.js2.2.3、count_reducer.js本示例补全 上一章 redux mini版示例&#xff0c;使用…

Codeforces Round #721 (Div. 2) C. Sequence Pair Weight

翻译&#xff1a; 序列的权值定义为具有相同值(&#x1d44e;&#x1d456;&#x1d44e;&#x1d457;)的无序索引对(&#x1d456;&#xff0c;&#x1d457;)(这里&#x1d456;<&#x1d457;)的数量。例如&#xff0c;序列&#x1d44e;[1,1,2,2,1]的权值为4。具有相同…

5-UI自动化-三大切换,iframe如何定位,窗口新开、alert弹窗如何进行元素定位

5-UI自动化-三大切换&#xff0c;iframe如何定位&#xff0c;窗口新开、alert弹窗如何进行元素定位新开一个窗口如何定位元素switch_to方法iframe定位元素alert弹窗如何定位元素上篇介绍4-UI自动化-selenium三大等待操作 web测试过程中有没有遇到以下问题&#xff1a; 1、测试…