基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 来个目录吧:第一章-入门第二章- Entity Framework Core Nuget包管理第三章-创建、修改、删除、查询第四章-排序、过滤、分页、分组第五章-迁移,EF Core 的codefirst使用暂时就这么多。

来个目录吧:
第一章-入门
第二章- Entity Framework Core Nuget包管理
第三章-创建、修改、删除、查询
第四章-排序、过滤、分页、分组
第五章-迁移,EF Core 的codefirst使用
暂时就这么多。后面陆续更新吧

EF Core 的codefirst使用

在本教程中,您将开始使用EF Core迁移功能来管理数据模型更改。在后面的教程中,您将在更改数据模型时添加更多迁移。

迁移简介

开发新应用程序时,数据模型会频繁更改,并且每次模型更改时,它都会与数据库不同步。
您通过配置Entity Framework以创建数据库(如果它不存在)来启动这些教程。
然后每次更改数据模型时,添加,删除或更改实体类或更改DbContext类 - 您可以删除数据库,EF将创建一个与模型匹配的新类,并为其添加测试数据。

这种使数据库与数据模型保持同步的方法运行良好,直到将应用程序部署到生产环境。
当应用程序在生产环境中运行时,它通常存储您想要保留的数据,并且您不希望每次进行更改时丢失所有内容,例如添加新列。
EF Core Migrations功能通过使EF更新数据库模式而不是创建新的数据库来解决这个问题。

更改连接字符串

在appsettings.json文件中,将连接字符串中的数据库名称更改为ContosoUniversity2 ,当然你可以自己取 个你喜欢的名字。

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

注意:
作为更改数据库名称的替代方法,您可以删除数据库。使用SQL Server对象资源管理器(SSOX)或使用database drop CLI命令:

dotnet ef database drop -c SchoolContext

以下部分说明如何使用CLI命令。

初始化迁移

保存您的更改并构建项目。然后打开命令窗口并导航到项目文件夹。这里有一个快速的方法:

解决方案资源管理器中,右键单击项目,然后从上下文菜单中选择在文件资源管理器中打开。

img_dca83b098b2fb3c295c30f6a3280a3e2.png
Paste_Image.png

按住Shift键并右键单击文件资源管理器中的项目文件夹,然后从上下文菜单中选择打开命令窗口

img_2cb520c71574c3c21db1f4c87fce9ce3.png
Paste_Image.png

在输入命令之前,停止站点的IIS Express,或者您可能会收到一条错误消息:“ 无法访问文件... ContosoUniversity.dll,因为它正被另一个进程使用 ”。要停止站点,请找到IIS Express图标,然后右键单击它,然后单击ContosoUniversity停止站点。

停止IIS Express后,在命令窗口中输入以下命令:

dotnet ef migrations add InitialCreate -c SchoolContext

在命令窗口中看到如下输出:

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:15.63
Done. To undo this action, use 'ef migrations remove'

您必须包含-c SchoolContext参数以指定数据库上下文类,因为项目有两个上下文类(另一个是ASP.NET Identity)。

检查Up和Down方法

当您执行migrations add命令时,EF生成将从头创建数据库的代码。此代码位于Migrations文件夹中的名为的文件中_InitialCreate.cs。类的Up方法InitialCreate创建与数据模型实体集对应的数据库表,Down方法将删除它们,如下面的示例所示。

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Student",
            columns: table => new
            {
                ID = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                EnrollmentDate = table.Column<DateTime>(nullable: false),
                FirstMidName = table.Column<string>(nullable: true),
                LastName = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Student", x => x.ID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Course");
        // Additional code not shown
    }
}

迁移调用该Up方法来实现迁移的数据模型更改。当您输入回滚更新的命令时,Migrations会调用该Down方法。

此代码用于在输入migrations add InitialCreate命令时创建的初始迁移。迁移名称参数(在示例中为“InitialCreate”)用于文件名,可以是任何您想要的。最好选择一个字词或短语,总结迁移过程中所做的工作。例如,您可以将以后的迁移命名为“AddDepartmentTable”。

如果在数据库已存在时创建了初始迁移,则会生成数据库创建代码,但不必运行,因为数据库已与数据模型匹配。当您将应用程序部署到数据库尚不存在的另一个环境时,此代码将运行以创建数据库,因此首先测试它是一个好主意。这就是为什么你先更改了连接字符串中数据库的名称 - 这样迁移可以从头开始创建一个新的。

检查数据模型快照

迁移还会在Migrations / SchoolContextModelSnapshot.cs中创建当前数据库模式的“快照” 。下面是该代码的样子:

[DbContext(typeof(SchoolContext))]
partial class SchoolContextModelSnapshot : ModelSnapshot
{
    protected override void BuildModel(ModelBuilder modelBuilder)
    {
        modelBuilder
            .HasAnnotation("ProductVersion", "1.0.0-rtm-21431")
            .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

        modelBuilder.Entity("ContosoUniversity.Models.Course", b =>
            {
                b.Property<int>("CourseID");

                b.Property<int>("Credits");

                b.Property<string>("Title")
                    .HasAnnotation("MaxLength", 50);

                b.HasKey("CourseID");

                b.ToTable("Course");
            });

        // Additional code for Enrollment and Student tables not shown

        modelBuilder.Entity("ContosoUniversity.Models.Enrollment", b =>
            {
                b.HasOne("ContosoUniversity.Models.Course", "Course")
                    .WithMany("Enrollments")
                    .HasForeignKey("CourseID")
                    .OnDelete(DeleteBehavior.Cascade);

                b.HasOne("ContosoUniversity.Models.Student", "Student")
                    .WithMany("Enrollments")
                    .HasForeignKey("StudentID")
                    .OnDelete(DeleteBehavior.Cascade);
            });
    }
}

由于此代码必须在最新迁移后反映数据库状态,因此您无法通过删除名为的文件来删除迁移 __.cs
如果删除该文件,则剩余的迁移将与数据库快照文件不同步。
要删除您添加的最后一个迁移,请使用dotnet ef migrations remove命令。

将迁移应用于数据库

在命令窗口中,输入以下命令以在其中创建数据库和表。

dotnet ef database update -c SchoolContext

命令的输出与命令migrations add类似。

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:17.34
Done.

使用SQL Server对象资源管理器来检查数据库,就像您在第一个教程中一样。
您将注意到添加了一个__EFMigrationsHistory表,以跟踪哪些迁移已应用于数据库。
查看该表中的数据,您将看到第一次迁移的一个条目。

img_e290d9ef1540b4d7e80b670de31da797.png
Paste_Image.png

运行应用程序以验证一切仍然与以前一样工作。

img_81ec808b5940bbe58098f2aec303c318.png
Paste_Image.png

命令行界面(CLI)与软件包管理器控制台(PMC)

用于管理迁移的EF工具可从.NET Core CLI命令或Visual Studio 程序包管理器控制台(PMC)窗口中的PowerShell cmdlet获取。
本教程介绍如何使用CLI,但如果您愿意,可以使用PMC。
有关CLI命令的信息,请参阅.NET Core CLI

有关PMC命令的信息,请参阅软件包管理器控制台(Visual Studio)

作者没说,我就先写在这了吧。
我的建议是我们不要用上面的方式玩codefirst。跟着我的节奏来。

我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

首先我们安装下

img_2b81bf673e5aed0e624b6734b30df199.png
Paste_Image.png
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer

PM> Install-Package Microsoft.EntityFrameworkCore.Tools

看到上图了没,依次安装。
然后再回到文件DbInitializer把代码:

  context.Database.EnsureCreated();

注释掉。


img_0831c293ad01e299d503f87a084777a9.png
Paste_Image.png

然后就跟用ef6一样了。在程序包管理控制台输入:

PM> Add-Migration InitFirstMigration
img_04216562ffe984f3b5d6a07956d27706.png
Paste_Image.png

会生成两个迁移文件。
然后我们执行命令

PM> Update-database

整个工程就ok了。

目录
相关文章
|
2月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
62 5
|
2月前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
127 18
|
2月前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
65 1
|
3月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
65 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
2月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
59 3
|
3月前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
128 0
|
4月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
5月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
74 7
|
5月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
116 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
85 0

热门文章

最新文章