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

32 篇文章 42 订阅

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模式可能会更加方便友好。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ASP.NET Core 3.1是一个跨平台、高性能的开源框架,它可以帮助我们快速地构建Web应用程序。ASP.NET Core 3.1中文教程可以为初学者提供一个快速上手的指南,帮助他们了解和掌握该框架的各种功能。 在学习ASP.NET Core 3.1教程之前,我们需要了解一些基本的编程概念和技能, 包括C#语言的基础知识、MVC(Model View Controller)等常见的编程模式、以及前端技术如HTML、CSS和JavaScript等。此外,我们还需要对.NET Core框架有一定的了解,如.NET Core的概念、架构和基础组件等。 学习ASP.NET Core 3.1的教程需要深入理解其设计方案和特点,例如跨平台、高性能、依赖注入、实时通信等。此外,我们还需要熟悉其主要组件,如ASP.NET Core的中间件、MVC框架、Entity Framework Core等。 在学习ASP.NET Core 3.1的教程时,我们需要通过实践才能更好地理解其所涉及的技术和概念。因此,我们需要通过编写各种实际的Web应用程序和示例,来实践和掌握所学的技巧和知识。 总之,学习ASP.NET Core 3.1的中文教程需要较深的前置知识储备和实操经验,而且需要坚持不懈地学习和练习以提高自己的技能水平。 ### 回答2: ASP.NET Core 3.1是目前为止最新的ASP.NET Core版本,它是一个跨平台的Web应用程序开发框架。对于想要学习ASP.NET Core 3.1的开发者来说,中文教程是非常重要的。 现在,有很多中文教程可以帮助开发者快速入门ASP.NET Core 3.1。这些教程通常包括以下内容: 1. ASP.NET Core 3.1的基础知识:网页处理、路由、控制器等; 2. ASP.NET Core 3.1中的模型、视图和控制器; 3. 动作过滤器和特性; 4. 实体框架和数据库相关操作; 5. API设计和测试等。 这些教程通常包含实例和练习,能够帮助开发者深入理解ASP.NET Core 3.1的开发原理。另外,一些知名的在线教育平台,如网易云课堂等,也提供了ASP.NET Core 3.1的中文课程,有兴趣的开发者可以去尝试。 总的来说,学习ASP.NET Core 3.1需要投入时间和精力,但是中文教程能够让初学者更加轻松地掌握ASP.NET Core 3.1的开发技能,更好地进行ASP.NET Core 3.1的开发工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值