第四单元 管理数据库架构

这篇具有很好参考价值的文章主要介绍了第四单元 管理数据库架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步。至于我们应该选用哪个方法,请确定你是希望以 EF Core 模型为准还是以数据库为准。

  1. 如果希望以 EF Core 模型为准,请使用迁移。 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库,以使数据库保持与 EF Core 模型兼容(CodeFirst,小项目用这种)。

  2. 如果希望以数据库架构为准,请使用反向工程。 使用此方法,可通过将数据库架构反向工程到 EF Core 模型来生成相应的 DbContext 和实体类型(DbFirst,中大型项目建议使用)。

 文章来源地址https://www.toymoban.com/news/detail-750550.html

1. 数据迁移

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

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

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

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

 

安装工具

首先,必须安装 EF Core 命令行工具

  • 我们通常建议使用 .NET Core CLI 工具,该工具适用于所有平台。

    # 安装
    dotnet tool install -g --version 6.0.4 dotnet-ef
    
    # 更新
    dotnet tool update --global dotnet-ef --version 6.0.7
    
    # 在将工具用于特定项目之前,需要将 Microsoft.EntityFrameworkCore.Design 添加到该项目中。
    dotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0.4
    dotnet add package Microsoft.EntityFrameworkCore.Tools --version 6.0.4
    # 验证
    dotnet ef
    
    _/\__
                   ---==/    \\
             ___  ___   |.    \|\
            | __|| __|  |  )   \\\
            | _| | _|   \_/ |  //|\\
            |___||_|       /   \\\/\\
    
    Entity Framework Core .NET Command-line Tools 2.1.3-rtm-32065
    
    <Usage documentation follows, not shown.>

     

    常用选项

    选项 Short 说明
    --json   显示 JSON 输出。
    --context <DBCONTEXT> -c 要使用的 DbContext 类。 仅类名或完全限定命名的空间。 如果省略此选项,EF Core 将查找上下文类。 如果有多个上下文类,则此选项是必需的。
    --project <PROJECT> -p 目标项目的项目文件夹的相对路径。 默认值是当前文件夹。
    --startup-project <PROJECT> -s 启动项目的项目文件夹的相对路径。 默认值是当前文件夹。
    --framework <FRAMEWORK>   目标框架目标框架名字对象。 当项目文件指定了多个目标框架,并且你想要选择其中一个目标框架时,请使用此选项。
    --configuration <CONFIGURATION>   生成配置,例如 DebugRelease
    --runtime <IDENTIFIER>   要为其还原包的目标运行时的标识符。 有关运行时标识符 (RID) 的列表,请参阅 RID 目录
    --no-build   请勿生成项目。 旨在在生成处于最新状态时使用。
    --help -h 显示帮助信息。
    --verbose -v 显示详细输出。
    --no-color   请勿为输出着色。
    --prefix-output   具有级别的前缀输出。
  • 如果你更喜欢在 Visual Studio 内工作或你具有 EF6 迁移经验,还可以使用程序包管理器控制台工具

    # 安装
    Install-Package Microsoft.EntityFrameworkCore.Tools
    
    # 更新
    Update-Package Microsoft.EntityFrameworkCore.Tools
    
    # 验证安装
    Get-Help about_EntityFrameworkCore
    
    _/\__
                   ---==/    \\
             ___  ___   |.    \|\
            | __|| __|  |  )   \\\
            | _| | _|   \_/ |  //|\\
            |___||_|       /   \\\/\\
    
    ......

     

    通用参数

    下表显示了所有 EF Core 命令的通用参数:

    参数 说明
    -Context <String> 要使用的 DbContext 类。 仅类名或完全限定命名的空间。 如果省略此参数,EF Core 将查找上下文类。 如果有多个上下文类,则此参数是必需的。
    -Project <String> 目标项目。 如果省略此参数,则包管理器控制台的默认项目将用作目标项目。
    -StartupProject <String> 启动项目。 如果省略此参数,则解决方案属性中的启动项目将用作目标项目。
    -Args <String> 传递给应用程序的参数。 已在 EF Core 5.0 中添加。
    -Verbose 显示详细输出。

创建第一个迁移

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

 

你现在已准备好添加第一个迁移! 指示 EF Core 创建名为 InitialCreate 的迁移:

.NET CLI

dotnet ef migrations add InitialCreate

 

VisualStudio

Add-Migration InitialCreate

 

 

EF Core 将在项目中创建一个名为“Migrations”的目录,并生成一些文件。 最好检查 EF Core 生成的内容,并在可能的情况下修改它,但现在我们跳过此操作。

创建数据库和架构

此时,可以让 EF 创建数据库并从迁移中创建架构。 可以通过以下操作实现这一点:

 

.NET CLI

dotnet ef database update

 

VisualStudio

Update-Database

 

就是这么回事 - 你的应用程序已准备好在新数据库上运行,你无需编写任何 SQL 代码。 请注意,这种应用迁移的方法非常适合本地开发,但不太适用于生产环境 - 有关详细信息,请参阅应用迁移页面

 

发展模型

几天后,系统会要求你将创建时间戳添加到博客。 你已完成针对应用程序的必要更改,模型现在如下所示:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedTimestamp { get; set; }
}

 

模型和生产数据库现在不同步,我们必须向数据库架构中添加一个新列。 让我们为此创建新迁移:

 

.NET CLI

dotnet ef migrations add AddBlogCreatedTimestamp

 

VisualStudio

Add-Migration AddBlogCreatedTimestamp

 

 

请注意,我们为迁移提供了一个描述性名称,以便以后更容易了解项目历史记录。

由于这不是项目的第一次迁移,EF Core 现在会在添加列之前将更新的模型与旧模型的快照进行比较;模型快照是 EF Core 在你添加迁移时生成的文件之一,并签入到源代码管理中。 基于该比较,EF Core 检测到已添加一列,并添加适当的迁移。

现在,你可以像以前一样应用迁移:

.NET CLI

dotnet ef database update

 

VisualStudio

Update-Database

 

请注意,这次 EF 检测到数据库已存在。 此外,在之前第一次应用迁移时,此事实记录在数据库中的特殊迁移历史记录表中;这允许 EF 自动仅应用新的迁移。

 

排除模型的各个部分

备注

EF Core 5.0 中已引入此功能。

有时,你可能希望引用其他 DbContext 中的类型(表)。 这可能会导致迁移冲突。 若要防止出现这种情况,请从 DbContext 之一的迁移中排除该类型。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUser>()
        .ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}

 

 

命名空间

可以手动移动 Migrations 文件并更改其命名空间。 新建的迁移和上个迁移同级。 或者,可以在生成时指定目录,如下所示:

.NET CLI

dotnet ef migrations add InitialCreate --output-dir Your/Directory

 

VisualStudio

Add-Migration InitialCreate -OutputDir Your\Directory

 

在 EF Core 5.0 中,你还可以使用 -Namespace 独立于目录更改命名空间。

删除迁移

有时,你可能在添加迁移后意识到需要在应用迁移前对 EF Core 模型作出其他更改。 要删除上个迁移,请使用如下命令。

如果迁移已被应用(执行了 database update),则无法使用remove。

.NET CLI

dotnet ef migrations remove

 

VisualStudio

Remove-Migration

 

列出迁移

你可以列出现有的所有迁移,如下所示:

.NET CLI

dotnet ef migrations list

 

VisualStudio

Get-Migration

 

 

重置所有迁移

在某些极端情况下,可能需要删除所有迁移并重新开始。 这可以通过删除 Migrations 文件夹并删除数据库来轻松完成;此时,你可以创建一个新的初始迁移,其中将包含当前的整个架构。

你还可以重置所有迁移并创建单个迁移,而不会丢失数据。 此操作有时称为“更正”,涉及一些手动操作:

  • 删除 Migrations 文件夹

  • 创建新迁移并为其生成 SQL 脚本

  • 在数据库中,删除迁移历史记录表中的所有行

  • 在迁移历史记录中插入一行,以记录第一个迁移已经应用,因为表已经存在。 insert SQL 是上面生成的 SQL 脚本中的最后一个操作(在我们删除了Migrations文件夹中所有的迁移文件以及删除完_efmigrationshistory表中的记录之后,再执行一次migrations add 的命令,表示重新添加一条记录,然后不要执行database update 命令,最后再把刚刚迁移生成的记录添加至__efmigrationshistory 表中)。

警告

删除 Migrations 文件夹后,所有自定义迁移代码都将丢失。 若要保留任何自定义项,必须手动将其应用到新的初始迁移。

 

2. 应用迁移

添加迁移后,需要将其部署并应用到数据库。 有多种策略可用于执行此操作,其中一些更适合生产环境,而另一些更适合开发生命周期。

备注

无论部署策略是什么,都应检查生成的迁移并进行测试,然后再将其应用于生产数据库。 迁移可能会在意图是对列进行重命名时删除该列,或者在应用于数据库时因各种原因而失败。

SQL 脚本

建议通过生成 SQL 脚本,将迁移部署到生产数据库。 此策略的优点包括:

  • 可以检查 SQL 脚本的准确性;这一点很重要,因为将架构更改应用于生产数据库是一项可能导致数据丢失的潜在危险操作。

  • 在某些情况下,可以根据生产数据库的特定需求调整这些脚本。

  • SQL 脚本可以与部署技术结合使用,甚至可以在 CI 过程中生成。

  • SQL 脚本可以提供给 DBA,并且可以单独管理和存档。

基本用法

以下命令将生成一个从空白数据库到最新迁移的 SQL 脚本:

.NET CLI

dotnet ef migrations script

 

VisualStudio

Script-Migration

 

 

3. 反向工程

反向工程是基于数据库架构搭建实体类型类和 DbContext 类基架的过程。 可使用 EF Core 包管理器控制台 (PMC) 工具的 Scaffold-DbContext 命令或 .NET 命令行接口 (CLI) 工具的 dotnet ef dbcontext scaffold 命令执行这一过程。

先决条件

  • 在进行反向工程之前,需要安装 PMC 工具(仅限 Visual Studio)或 CLI 工具。 有关详细信息,请参阅链接。

  • 在要搭建基架的项目中安装 Microsoft.EntityFrameworkCore.Design 的 NuGet 包。

  • 还需要为要进行反向工程的数据库架构安装适当的数据库提供程序

连接字符串

该命令的第一个参数是指向数据库的连接字符串。 工具将使用此连接字符串来读取数据库架构。

引用和转义连接字符串的方式取决于用于执行命令的 shell。 有关详细信息,请参阅 shell 的文档。 例如,PowerShell 要求转义 $ 字符,而不是 \

.NET CLI

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

 

VisualStudio

Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer
 

 

指定表

默认情况下,将数据库架构中的所有表反向工程为实体类型。 可通过指定架构和表来限制对哪些表进行反向工程。

.NET CLI

--schema 选项可用于包含架构中的每个表,而 --table 可用于包含特定表。

若要包含多个表,请多次指定选项:

dotnet ef dbcontext scaffold ... --table Artist --table Album

 

VisualStudio

-Schemas 选项可用于包含架构中的每个表,而 -Tables 可用于包含特定表。

若要包含多个表,请使用数组:

Scaffold-DbContext ... -Tables Artist, Album

 

保留名称

默认情况下,表和列名已修正,以便更好地匹配类型和属性的 .NET 命名约定。 在 PMC 中指定 -UseDatabaseNames 开关或在 .NET Core CLI 中指定 --use-database-names 选项将禁用此行为,从而尽可能保留原始数据库名称。 无效的 .NET 标识符仍将被修正,而合成名称(如导航属性)仍将符合 .NET 命名约定。

 

DbContext 名称

默认情况下,已搭建基架的 DbContext 类名称将是后缀为 Context 的数据库名称。 若要指定不同名称,请在 PMC 中使用 -Context,在 .NET Core CLI 中使用 --context

目录和命名空间

实体类和 DbContext 类将搭建到项目的根目录中,并使用项目的默认命名空间。

.NET CLI

可使用 --output-dir 指定在其中为类搭建基架的目录,并且可使用 --context-dir 将 DbContext 类搭建到与实体类型类不同的目录中:

dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

 

默认情况下,命名空间将是根命名空间加上项目根目录下任何子目录的名称。 但是,从 EFCore 5.0 开始,可使用 --namespace 覆盖所有输出类的命名空间。 还可使用 --context-namespace 仅覆盖 DbContext 类的命名空间:

dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace

 

 

VisualStudio

可使用 -OutputDir 指定在其中为类搭建基架的目录,并且可使用 -ContextDir 将 DbContext 类搭建到与实体类型类不同的目录中:

Scaffold-DbContext ... -ContextDir Data -OutputDir Models

 

默认情况下,命名空间将是根命名空间加上项目根目录下任何子目录的名称。 但是,从 EFCore 5.0 开始,可使用 -Namespace 覆盖所有输出类的命名空间。 还可使用 -ContextNamespace 仅覆盖 DbContext 类的命名空间。

Scaffold-DbContext ... -Namespace Your.Namespace -ContextNamespace Your.DbContext.Namespace

 

 

配套视频链接:EFCore 与 WebAPI - 网易云课堂 (163.com)

 

 

到了这里,关于第四单元 管理数据库架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 系统架构设计师---事务管理、并发控制、数据库的备份与恢复

    目录 事务管理       定义       事务的四个特性(ACID)     相关SQL语句 并发控制     并发操作     封锁  数据库的备份与恢复      备份(转储)与恢复        备份分类       数据库的四类故障          DBMS 运行的基本工作单位是事务,事务是用户定义的一个数据库

    2024年02月12日
    浏览(58)
  • NoSQL 数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数据存储提供无与伦比的灵活性与性能!

    【官网地址】:http://www.redisant.cn/nosql 直观的用户界面 从单一应用程序中同时连接 Redis、Memcached、SSDB、LevelDB、RocksDB,你可以快速轻松地创建、管理和维护数据库。 简洁的数据操作 快速搜索、编辑、删除、创建键;支持丰富的数据类型,包括:JSON、XML、HEX、MsgPack、YAML、整

    2024年02月21日
    浏览(44)
  • 毕业设计——基于SpringBoot+Mybatis+Thymeleaf架构实现的员工管理系统(源码+数据库)

    完整项目地址:https://download.csdn.net/download/lijunhcn/88430276 SpringBoot整合CRUD实现员工管理案例,将Mybatis整合到原项目中,加入了数据库,添加了日期选项的控件。 环境要求 JDK8以上 IDEA MySQL8 Maven3 需要熟练掌握MySQL数据库,SpringBoot及MyBatis知识,简单的前端知识; 数据库环境 创建

    2024年02月03日
    浏览(51)
  • 【大学生体质】图书管理系统(Vue+SpringBoot2)-完整部署教程【课设OR毕设提供API接口文档、数据库文件、README.MD、部署视频】

    本项目拥有完整的API后台接口文档(文尾) 项目部署视频正在录制 如果项目对您有所帮助,可以Star⭐一下,受到鼓励的我会继续加油。 项目在线演示地址 项目前端地址 项目后端地址 项目部署视频 ☃️前端主要技术栈 技术 作用 版本 Vue 提供前端交互 2.6.14 Vue-Router 路由式编

    2024年01月18日
    浏览(54)
  • 数据库基础面试第四弹

    1. 字符串(String): 字符串是Redis最基本的数据结构。它可以存储任意类型的数据,包括文本、整数或二进制数据。字符串类型的值最大可以达到512MB。 2. 列表(List): 列表是一个有序的字符串集合。它允许在列表的两端进行元素的插入和删除操作,支持按照索引获取元素

    2024年02月09日
    浏览(32)
  • Java项目:基于SSM框架实现同城蔬菜配送管理系统(SSM+B/S架构+源码+数据库+毕业论文)

    本项目是一套ssm825基于SSM框架实现同城蔬菜配送管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或idea 确保可以运行! 该系统功能

    2024年01月25日
    浏览(58)
  • leetcode数据库题第四弹

    https://leetcode.cn/problems/biggest-single-number/ 简单的聚合,用group 加 having 轻松完成一拖三 CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei https://leetcode.cn/problems/not-boring-movies/ 嗯,oracle 居然不支持 % 运算求余 https://leetcode.cn/problems/exchange-seats/ 这个题目有问题,在力扣官方修正之前,

    2024年02月08日
    浏览(72)
  • 数据库第四章习题_完整版

    1.1 请考虑以下 SQL 查询,该查询旨在查找 2017 年春季讲授的所有课程的标题以及教师的姓名的列表。 请问这个查询有什么问题? 首先 section 中并没有我们需要使用到的属性,所以这里 “natural join setion” 是多余的。 其次,更重要的一点是:在 instructor 关系和 course 关系中都有

    2024年02月07日
    浏览(38)
  • 第四章——数据库的安全性

    问题的提出:数据库安全性产生的原因 数据库的一大特点是共享性 数据共享必然带来数据库安全性问题 数据库系统中的数据共享不能是无条件的共享 数据库的安全性是指保护数据库以防止不合法的使用所造成的的数据泄露、更改或破坏 系统安全保护措施是否有效是数据库

    2023年04月08日
    浏览(41)
  • 《数据库原理MySQL》第四次上机实验

    一、连接查询 1.查询女学生的学生学号及总成绩 2.查询李勇同学所选的课程号及成绩 3.查询李新老师所授课程的课程名称 4.查询女教师所授课程的课程号及课程名称 5.查询姓“王”的学生所学的课程名称 6.查询选修“数据库”课程且成绩在 80 到 90 之间的学生学号及成绩 7.查

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包