注意
此版本不是本文的最新版本。 有关当前版本,请参阅本文的 .NET 9 版本。
重要
此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。
有关当前版本,请参阅本文的 .NET 9 版本。
在本教程中,添加了用于管理数据库中的电影的类。 应用程序的模型类使用 Entity Framework Core (EF Core) 来处理数据库。 EF Core 是一种对象关系映射器 (O/RM),可简化数据访问。 首先要编写模型类,然后 EF Core 将创建数据库。
模型类称为 POCO 类(源自“简单传统 CLR 对象”),因为它们与 没有任何依赖关系。 它们定义数据库中存储的数据属性。
添加数据模型
在解决方案资源管理器中,右键单击“RazorPagesMovie”项目>“添加”>“新建文件夹”。 将该文件夹命名为 Models
注册一个免费试用帐户。
右键单击 Models
文件夹。 选择“添加”“类” 。 将类命名“Movie”。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
public decimal Price { get; set; }
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
生成项目以验证没有任何编译错误。
- 添加名为
Models
的文件夹。
- 将类添加到名为
Models
的 Movie.cs
文件夹。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
public decimal Price { get; set; }
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
运行以下 .NET CLI 命令:
dotnet tool uninstall --global dotnet-aspnet-codegenerator
dotnet tool install --global dotnet-aspnet-codegenerator
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.SQLite
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
上述命令添加:
有关允许应用按环境配置其数据库上下文的多个环境配置指南,请参阅在 ASP.NET Core 中使用多个环境。
在 Visual Studio Code 中,按 Ctrl +F5 运行应用而不进行调试。
在编辑器区域下面的面板中,选择“问题”选项卡,或者从“视图”菜单中选择“问题”(如果当前不在视图中)。 验证没有编译错误。
搭建“电影”模型的基架
在此部分,将搭建“电影”模型的基架。 确切地说,基架工具将生成页面,用于对“电影”模型执行创建、读取、更新和删除 (CRUD) 操作。
创建“Pages/Movies”文件夹:
- 右键单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
右键单击 Pages/Movies 文件夹 “添加”>“已搭建基架的新项”。

在“添加新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“添加”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“模型类”下拉列表中,选择“Movie (RazorPagesMovie.Models)。
- 在“数据上下文类”行中,选择 (加号)。
- 在“添加数据上下文”对话框中,生成类名 。
- 在“数据库提供程序”下拉列表中,选择“SQL Server”。
- 选择 添加 。

appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
打开项目目录(包含 Program.cs
和 .csproj
文件)的命令行界面。 运行以下命令:
dotnet aspnet-codegenerator razorpage -m Movie -dc RazorPagesMovie.Data.RazorPagesMovieContext -udl -outDir Pages/Movies --referenceScriptLibraries --databaseProvider sqlite
下表详细说明了 ASP.NET Core 代码生成器选项。
选项 |
说明 |
-m |
模型的名称。 |
-dc |
要使用的 DbContext 类,包括命名空间。 |
-udl |
使用默认布局。 |
-outDir |
用于创建视图的相对输出文件夹路径。 |
--referenceScriptLibraries |
向“编辑”和“创建”页面添加 _ValidationScriptsPartial |
使用 -h
选项获取 dotnet aspnet-codegenerator razorpage
命令方面的帮助:
dotnet aspnet-codegenerator razorpage -h
有关详细信息,请查看 dotnet aspnet-codegenerator。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 以下代码演示了如何在开发中选择 SQLite 连接字符串,以及在生产中选择 SQL Server。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前面的代码不会在开发中调用 UseDeveloperExceptionPage
,因为 WebApplication
会在开发模式下调用 UseDeveloperExceptionPage
。
警告
本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。
创建和更新的文件
在搭建基架时,会创建以下文件:
- Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和“索引”。
Data/RazorPagesMovieContext.cs
创建的文件将在下一教程中说明。
基架进程将以下突出显示的代码添加到 Program.cs
文件中:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
本教程稍后将介绍 Program.cs
更改。
使用 EF 的迁移功能创建初始数据库架构
Entity Framework Core 中的迁移功能提供了一种方法来执行以下操作:
- 创建初始数据库架构。
- 以增量的方式更新数据库架构,使其与应用的数据模型保持同步。 保存数据库中的现有数据。
在此部分中,程序包管理器控制台 (PMC) 窗口用于:
添加初始迁移。
使用初始迁移来更新数据库。
在“工具”菜单中,选择“NuGet 包管理器”“包管理器控制台”。

在 PMC 中,输入以下命令:
Add-Migration InitialCreate
Add-Migration
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
将显示以下警告,该警告将在后面的步骤中解决:
No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'.
右键单击“RazorPagesMovie.csproj”项目,然后选择“在集成终端中打开”。
此时会打开“终端”窗口,并在包含 Program.cs 和 .csproj 文件的项目目录处显示命令提示符。
运行以下 .NET CLI 命令:
dotnet ef migrations add InitialCreate
migrations
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
运行以下 .NET CLI 命令:
dotnet ef database update
update
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,update
在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
注意
对于 SQLite,Price
字段的列类型设置为 TEXT
。 后一个步骤中解决了此问题。
数据上下文 RazorPagesMovieContext
:
生成的文件 RazorPagesMovieContext
中的类 Data/RazorPagesMovieContext.cs
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
前面的代码为实体集创建 DbSet<Movie> 属性。 在实体框架术语中,实体集通常与数据表相对应。 实体对应表中的行。
通过调用 DbContextOptions 对象中的一个方法将连接字符串名称传递到上下文。 进行本地开发时,配置系统在 appsettings.json
文件中读取连接字符串。
测试应用
运行应用并将 /Movies
追加到浏览器中的 URL (http://localhost:port/movies
)。
如果收到以下错误:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
缺少迁移步骤。
测试“新建”链接。

注意
可能无法在 Price
字段中输入十进制逗号。 若要使 jQuery 验证支持使用逗号(“,”)表示小数点的非英语区域设置,以及支持非美国英语日期格式,应用必须进行全球化。 有关全球化的说明,请参阅此 GitHub 问题。
测试“编辑”、“详细信息”和“删除”链接。
下一个教程介绍由基架创建的文件。
检查通过依赖关系注入注册的上下文
ASP.NET Core 通过依赖关系注入进行生成。 在应用程序启动过程中通过依赖关系注入注册相关服务(例如 EF Core 数据库上下文)。 需要这些服务(如 Razor Pages)的组件通过构造函数参数提供。 本教程的后续部分介绍了用于获取数据库上下文实例的构造函数代码。
基架工具自动创建数据库上下文并将其注册到依赖关系注入容器。 基架将以下突出显示的代码添加到 Program.cs
文件中:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
用完成的示例进行故障排除
如果遇到无法解决的问题,请将你的代码与完成的项目进行比较。 查看或下载已完成的项目(如何下载)。
后续步骤
在本教程中,添加了用于管理数据库中的电影的类。 应用程序的模型类使用 Entity Framework Core (EF Core) 来处理数据库。 EF Core 是一种对象关系映射器 (O/RM),可简化数据访问。 首先要编写模型类,然后 EF Core 将创建数据库。
模型类称为 POCO 类(源自“简单传统 CLR 对象”),因为它们与 没有任何依赖关系。 它们定义数据库中存储的数据属性。
添加数据模型
在解决方案资源管理器中,右键单击“RazorPagesMovie”项目>“添加”>“新建文件夹”。 将该文件夹命名为 Models
注册一个免费试用帐户。
右键单击 Models
文件夹。 选择“添加”“类” 。 将类命名“Movie”。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
public decimal Price { get; set; }
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
生成项目以验证没有任何编译错误。
- 添加名为
Models
的文件夹。
- 将类添加到名为
Models
的 Movie.cs
文件夹。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
public decimal Price { get; set; }
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
运行以下 .NET CLI 命令:
dotnet tool uninstall --global dotnet-aspnet-codegenerator
dotnet tool install --global dotnet-aspnet-codegenerator
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.SQLite
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
上述命令添加:
有关允许应用按环境配置其数据库上下文的多个环境配置指南,请参阅在 ASP.NET Core 中使用多个环境。
在 Visual Studio Code 中,按 Ctrl +F5 运行应用而不进行调试。
在编辑器区域下面的面板中,选择“问题”选项卡,或者从“视图”菜单中选择“问题”(如果当前不在视图中)。 验证没有编译错误。
在“解决方案工具窗口”中,按 Control 并单击“RazorPagesMovie”项目,然后选择“添加”>“新建文件夹...”。将文件夹命名为 Models
。
按 Control 并单击 Models
文件夹,然后选择“添加”“新建类...”。
在“新建文件”对话框中:
- 在左侧窗格中,选择“常规”。
- 在中间窗格中,选择“空类”。
- 将此类命名为“Movie”,然后选择“创建” 。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
public decimal Price { get; set; }
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
生成项目以验证没有任何编译错误。
搭建“电影”模型的基架
在此部分,将搭建“电影”模型的基架。 确切地说,基架工具将生成页面,用于对“电影”模型执行创建、读取、更新和删除 (CRUD) 操作。
创建“Pages/Movies”文件夹:
- 右键单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
右键单击 Pages/Movies 文件夹 “添加”>“已搭建基架的新项”。

在“添加新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“添加”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“模型类”下拉列表中,选择“Movie (RazorPagesMovie.Models)。
- 在“数据上下文类”行中,选择 (加号)。
- 在“添加数据上下文”对话框中,生成类名 。
- 在“数据库提供程序”下拉列表中,选择“SQL Server”。
- 选择 添加 。

appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
打开项目目录(包含 Program.cs
和 .csproj
文件)的命令行界面。 运行以下命令:
dotnet aspnet-codegenerator razorpage -m Movie -dc RazorPagesMovie.Data.RazorPagesMovieContext -udl -outDir Pages/Movies --referenceScriptLibraries --databaseProvider sqlite
下表详细说明了 ASP.NET Core 代码生成器选项。
选项 |
说明 |
-m |
模型的名称。 |
-dc |
要使用的 DbContext 类,包括命名空间。 |
-udl |
使用默认布局。 |
-outDir |
用于创建视图的相对输出文件夹路径。 |
--referenceScriptLibraries |
向“编辑”和“创建”页面添加 _ValidationScriptsPartial |
使用 -h
选项获取 dotnet aspnet-codegenerator razorpage
命令方面的帮助:
dotnet aspnet-codegenerator razorpage -h
有关详细信息,请查看 dotnet aspnet-codegenerator。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 以下代码演示了如何在开发中选择 SQLite 连接字符串,以及在生产中选择 SQL Server。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前面的代码不会在开发中调用 UseDeveloperExceptionPage
,因为 WebApplication
会在开发模式下调用 UseDeveloperExceptionPage
。
添加基架工具所需的 NuGet 包 Microsoft.EntityFrameworkCore.Sqlite
。
- 在“解决方案工具窗口”中,按 Control 并单击“RazorPagesMovie”项目,然后选择“在终端中打开”。
此时会打开“终端”窗口,并在包含 Program.cs 和 .csproj 文件的项目目录处显示命令提示符。
- 运行以下 .NET CLI 命令:
dotnet add package Microsoft.EntityFrameworkCore.SQLite
创建“Pages/Movies”文件夹:
- 按 Control 并单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
按 Control 并单击 Pages/Movies 文件夹 “添加”>“新基架...”。

在“新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“下一步”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“要使用的模型类”行中,输入 。
- 在“要使用的 DbContext 类:”行中,将类命名为 。
- 选择“完成”。

基架过程可能需要一些时间才能完成,因为所需的包会自动下载并添加到项目中。
appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 以下代码演示了如何在开发中选择 SQLite 连接字符串,以及在生产中选择 SQL Server。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前面的代码不会在开发中调用 UseDeveloperExceptionPage
,因为 WebApplication
会在开发模式下调用 UseDeveloperExceptionPage
。
警告
本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。
创建和更新的文件
在搭建基架时,会创建以下文件:
- Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和“索引”。
Data/RazorPagesMovieContext.cs
创建的文件将在下一教程中说明。
基架进程将以下突出显示的代码添加到 Program.cs
文件中:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
本教程稍后将介绍 Program.cs
更改。
使用 EF 的迁移功能创建初始数据库架构
Entity Framework Core 中的迁移功能提供了一种方法来执行以下操作:
- 创建初始数据库架构。
- 以增量的方式更新数据库架构,使其与应用的数据模型保持同步。 保存数据库中的现有数据。
在此部分中,程序包管理器控制台 (PMC) 窗口用于:
添加初始迁移。
使用初始迁移来更新数据库。
在“工具”菜单中,选择“NuGet 包管理器”“包管理器控制台”。

在 PMC 中,输入以下命令:
Add-Migration InitialCreate
Add-Migration
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
将显示以下警告,该警告将在后面的步骤中解决:
No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'.
右键单击“RazorPagesMovie.csproj”项目,然后选择“在集成终端中打开”。
此时会打开“终端”窗口,并在包含 Program.cs 和 .csproj 文件的项目目录处显示命令提示符。
运行以下 .NET CLI 命令:
dotnet ef migrations add InitialCreate
migrations
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
运行以下 .NET CLI 命令:
dotnet ef database update
update
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,update
在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
注意
对于 SQLite,Price
字段的列类型设置为 TEXT
。 后一个步骤中解决了此问题。
按 Control 并单击“RazorPagesMovie”项目,然后选择“在终端中打开”。
此时会打开“终端”窗口,并在包含 Program.cs 和 .csproj 文件的项目目录处显示命令提示符。
运行以下 .NET CLI 命令:
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
若存在任何以前的版本,tool
命令会将其卸载,然后安装最新的 Entity Framework Core 工具。
migrations
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
update
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,update
在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
注意
对于 SQLite,Price
字段的列类型设置为 TEXT
。 后一个步骤中解决了此问题。
将显示以下警告,该警告将在后面的步骤中解决:
No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'.
数据上下文 RazorPagesMovieContext
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
前面的代码为实体集创建 DbSet<Movie> 属性。 在实体框架术语中,实体集通常与数据表相对应。 实体对应表中的行。
通过调用 DbContextOptions 对象中的一个方法将连接字符串名称传递到上下文。 进行本地开发时,配置系统在 appsettings.json
文件中读取连接字符串。
测试应用
运行应用并将 /Movies
追加到浏览器中的 URL (http://localhost:port/movies
)。
如果收到以下错误:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
缺少迁移步骤。
测试“新建”链接。

注意
可能无法在 Price
字段中输入十进制逗号。 若要使 jQuery 验证支持使用逗号(“,”)表示小数点的非英语区域设置,以及支持非美国英语日期格式,应用必须进行全球化。 有关全球化的说明,请参阅此 GitHub 问题。
测试“编辑”、“详细信息”和“删除”链接。
下一个教程介绍由基架创建的文件。
检查通过依赖关系注入注册的上下文
ASP.NET Core 通过依赖关系注入进行生成。 在应用程序启动过程中通过依赖关系注入注册相关服务(例如 EF Core 数据库上下文)。 需要这些服务(如 Razor Pages)的组件通过构造函数参数提供。 本教程的后续部分介绍了用于获取数据库上下文实例的构造函数代码。
基架工具自动创建数据库上下文并将其注册到依赖关系注入容器。 基架将以下突出显示的代码添加到 Program.cs
文件中:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
用完成的示例进行故障排除
如果遇到无法解决的问题,请将你的代码与完成的项目进行比较。 查看或下载已完成的项目(如何下载)。
后续步骤
在本教程中,添加了用于管理数据库中的电影的类。 应用程序的模型类使用 Entity Framework Core (EF Core) 来处理数据库。 EF Core 是一种对象关系映射器 (O/RM),可简化数据访问。 首先要编写模型类,然后 EF Core 将创建数据库。
模型类称为 POCO 类(源自“简单传统 CLR 对象”),因为它们与 没有任何依赖关系。 它们定义数据库中存储的数据属性。
添加数据模型
在解决方案资源管理器中,右键单击“RazorPagesMovie”项目>“添加”>“新建文件夹”。 将该文件夹命名为 Models
注册一个免费试用帐户。
右键单击 Models
文件夹。 选择“添加”“类” 。 将类命名“Movie”。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
public decimal Price { get; set; }
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
生成项目以验证没有任何编译错误。
- 添加名为
Models
的文件夹。
- 将类添加到名为
Models
的 Movie.cs
文件夹。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
public decimal Price { get; set; }
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
运行以下 .NET CLI 命令:
dotnet tool uninstall --global dotnet-aspnet-codegenerator
dotnet tool install --global dotnet-aspnet-codegenerator
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.SQLite
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
上述命令添加:
有关允许应用按环境配置其数据库上下文的多个环境配置指南,请参阅在 ASP.NET Core 中使用多个环境。
在 Visual Studio Code 中,按 Ctrl +F5 运行应用而不进行调试。
在编辑器区域下面的面板中,选择“问题”选项卡,或者从“视图”菜单中选择“问题”(如果当前不在视图中)。 验证没有编译错误。
在“解决方案工具窗口”中,按 Control 并单击“RazorPagesMovie”项目,然后选择“添加”>“新建文件夹...”。将文件夹命名为 Models
。
按 Control 并单击 Models
文件夹,然后选择“添加”“新建类...”。
在“新建文件”对话框中:
- 在左侧窗格中,选择“常规”。
- 在中间窗格中,选择“空类”。
- 将此类命名为“Movie”,然后选择“创建” 。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
public decimal Price { get; set; }
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
生成项目以验证没有任何编译错误。
搭建“电影”模型的基架
在此部分,将搭建“电影”模型的基架。 确切地说,基架工具将生成页面,用于对“电影”模型执行创建、读取、更新和删除 (CRUD) 操作。
创建“Pages/Movies”文件夹:
- 右键单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
右键单击 Pages/Movies 文件夹 “添加”>“已搭建基架的新项”。

在“添加新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“添加”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“模型类”下拉列表中,选择“Movie (RazorPagesMovie.Models)。
- 在“数据上下文类”行中,选择 (加号)。
- 在“添加数据上下文”对话框中,生成类名 。
- 在“数据库提供程序”下拉列表中,选择“SQL Server”。
- 选择 添加 。

appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
打开项目目录(包含 Program.cs
和 .csproj
文件)的命令行界面。 运行以下命令:
dotnet aspnet-codegenerator razorpage -m Movie -dc RazorPagesMovie.Data.RazorPagesMovieContext -udl -outDir Pages/Movies --referenceScriptLibraries --databaseProvider sqlite
下表详细说明了 ASP.NET Core 代码生成器选项。
选项 |
说明 |
-m |
模型的名称。 |
-dc |
要使用的 DbContext 类,包括命名空间。 |
-udl |
使用默认布局。 |
-outDir |
用于创建视图的相对输出文件夹路径。 |
--referenceScriptLibraries |
向“编辑”和“创建”页面添加 _ValidationScriptsPartial |
使用 -h
选项获取 dotnet aspnet-codegenerator razorpage
命令方面的帮助:
dotnet aspnet-codegenerator razorpage -h
有关详细信息,请查看 dotnet aspnet-codegenerator。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 以下代码演示了如何在开发中选择 SQLite 连接字符串,以及在生产中选择 SQL Server。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前面的代码不会在开发中调用 UseDeveloperExceptionPage
,因为 WebApplication
会在开发模式下调用 UseDeveloperExceptionPage
。
添加基架工具所需的 NuGet 包 Microsoft.EntityFrameworkCore.Sqlite
。
- 在“解决方案工具窗口”中,按 Control 并单击“RazorPagesMovie”项目,然后选择“在终端中打开”。
此时会打开“终端”窗口,并在包含 Program.cs 和 .csproj 文件的项目目录处显示命令提示符。
- 运行以下 .NET CLI 命令:
dotnet add package Microsoft.EntityFrameworkCore.SQLite
创建“Pages/Movies”文件夹:
- 按 Control 并单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
按 Control 并单击 Pages/Movies 文件夹 “添加”>“新基架...”。

在“新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“下一步”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“要使用的模型类”行中,输入 。
- 在“要使用的 DbContext 类:”行中,将类命名为 。
- 选择“完成”。

基架过程可能需要一些时间才能完成,因为所需的包会自动下载并添加到项目中。
appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 以下代码演示了如何在开发中选择 SQLite 连接字符串,以及在生产中选择 SQL Server。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前面的代码不会在开发中调用 UseDeveloperExceptionPage
,因为 WebApplication
会在开发模式下调用 UseDeveloperExceptionPage
。
警告
本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。
创建和更新的文件
在搭建基架时,会创建以下文件:
- Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和“索引”。
Data/RazorPagesMovieContext.cs
创建的文件将在下一教程中说明。
基架进程将以下突出显示的代码添加到 Program.cs
文件中:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
本教程稍后将介绍 Program.cs
更改。
使用 EF 的迁移功能创建初始数据库架构
Entity Framework Core 中的迁移功能提供了一种方法来执行以下操作:
- 创建初始数据库架构。
- 以增量的方式更新数据库架构,使其与应用的数据模型保持同步。 保存数据库中的现有数据。
在此部分中,程序包管理器控制台 (PMC) 窗口用于:
在“工具”菜单中,选择“NuGet 包管理器”“包管理器控制台”。

在 PMC 中,输入以下命令:
Add-Migration InitialCreate
Update-Database
Add-Migration
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
Update-Database
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,命令在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
右键单击“RazorPagesMovie.csproj”项目,然后选择“在集成终端中打开”。
此时会打开“终端”窗口,并在包含 Program.cs 和 .csproj 文件的项目目录处显示命令提示符。
运行以下 .NET CLI 命令:
dotnet ef migrations add InitialCreate
dotnet ef database update
migrations
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
update
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,update
在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
注意
对于 SQLite,Price
字段的列类型设置为 TEXT
。 后一个步骤中解决了此问题。
按 Control 并单击“RazorPagesMovie”项目,然后选择“在终端中打开”。
此时会打开“终端”窗口,并在包含 Program.cs 和 .csproj 文件的项目目录处显示命令提示符。
运行以下 .NET CLI 命令:
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
若存在任何以前的版本,tool
命令会将其卸载,然后安装最新的 Entity Framework Core 工具。
migrations
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
update
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,update
在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
注意
对于 SQLite,Price
字段的列类型设置为 TEXT
。 后一个步骤中解决了此问题。
将显示以下警告,该警告将在后面的步骤中解决:
No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'.
数据上下文 RazorPagesMovieContext
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
前面的代码为实体集创建 DbSet<Movie> 属性。 在实体框架术语中,实体集通常与数据表相对应。 实体对应表中的行。
通过调用 DbContextOptions 对象中的一个方法将连接字符串名称传递到上下文。 进行本地开发时,配置系统在 appsettings.json
文件中读取连接字符串。
测试应用
运行应用并将 /Movies
追加到浏览器中的 URL (http://localhost:port/movies
)。
如果收到以下错误:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
缺少迁移步骤。
测试“新建”链接。

注意
可能无法在 Price
字段中输入十进制逗号。 若要使 jQuery 验证支持使用逗号(“,”)表示小数点的非英语区域设置,以及支持非美国英语日期格式,应用必须进行全球化。 有关全球化的说明,请参阅此 GitHub 问题。
测试“编辑”、“详细信息”和“删除”链接。
下一个教程介绍由基架创建的文件。
检查通过依赖关系注入注册的上下文
ASP.NET Core 通过依赖关系注入进行生成。 在应用程序启动过程中通过依赖关系注入注册相关服务(例如 EF Core 数据库上下文)。 需要这些服务(如 Razor Pages)的组件通过构造函数参数提供。 本教程的后续部分介绍了用于获取数据库上下文实例的构造函数代码。
基架工具自动创建数据库上下文并将其注册到依赖关系注入容器。 基架将以下突出显示的代码添加到 Program.cs
文件中:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
用完成的示例进行故障排除
如果遇到无法解决的问题,请将你的代码与完成的项目进行比较。 查看或下载已完成的项目(如何下载)。
后续步骤
在本教程中,添加了用于管理数据库中的电影的类。 应用程序的模型类使用 Entity Framework Core (EF Core) 来处理数据库。 EF Core 是一种对象关系映射器 (O/RM),可简化数据访问。 首先要编写模型类,然后 EF Core 将创建数据库。
模型类称为 POCO 类(源自“简单传统 CLR 对象”),因为它们与 没有任何依赖关系。 它们定义数据库中存储的数据属性。
添加数据模型
在解决方案资源管理器中,右键单击“RazorPagesMovie”项目>“添加”>“新建文件夹”。 将该文件夹命名为 Models
注册一个免费试用帐户。
右键单击 Models
文件夹。 选择“添加”“类” 。 将类命名“Movie”。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; } = string.Empty;
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; } = string.Empty;
public decimal Price { get; set; }
}
}
Movie
类包含:
- 添加名为
Models
的文件夹。
- 将类添加到名为
Models
的 Movie.cs
文件夹。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; } = string.Empty;
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; } = string.Empty;
public decimal Price { get; set; }
}
}
Movie
类包含:
运行以下 .NET CLI 命令:
dotnet tool uninstall --global dotnet-aspnet-codegenerator
dotnet tool install --global dotnet-aspnet-codegenerator
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.SQLite
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
上述命令添加:
有关允许应用按环境配置其数据库上下文的多个环境配置指南,请参阅在 ASP.NET Core 中使用多个环境。
在“解决方案工具窗口”中,右键单击“RazorPagesMovie”项目,然后选择“添加”>“新建文件夹...”。将文件夹命名为 Models
。
右键单击 Models
文件夹,然后选择“添加”“新建文件...”。
在“新建文件”对话框中:
- 在左侧窗格中,选择“常规”。
- 在中间窗格中,选择“空类”。
- 将此类命名为“Movie”,然后选择“创建” 。
向 Movie
类添加以下属性:
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; } = string.Empty;
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; } = string.Empty;
public decimal Price { get; set; }
}
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
生成项目以验证没有任何编译错误。
搭建“电影”模型的基架
在此部分,将搭建“电影”模型的基架。 确切地说,基架工具将生成页面,用于对“电影”模型执行创建、读取、更新和删除 (CRUD) 操作。
添加基架工具所需的 NuGet 包 Microsoft.EntityFrameworkCore.Design
。
- 在“工具”菜单中,依次选择“NuGet 包管理器”“管理解决方案的 NuGet 包”
- 选择“浏览”选项卡。
- 输入并从列表中选择
Microsoft.EntityFrameworkCore.Design
。
- 选中“项目”,然后选择“安装”
- 在“许可证接受”对话框中,选择“我接受” 。

创建“Pages/Movies”文件夹:
- 右键单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
右键单击 Pages/Movies 文件夹 “添加”>“已搭建基架的新项”。

在“添加新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“添加”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“模型类”下拉列表中,选择“Movie (RazorPagesMovie.Models)。
- 在“数据上下文类”行中,选择 (加号)。
- 在“添加数据上下文”对话框中,生成类名 。
- 选择 添加 。

如果收到错误消息,提示需要安装 Microsoft.EntityFrameworkCore.SqlServer
包,请重复从“添加”“已搭建基架的新项”开始的步骤。
appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
下表详细说明了 ASP.NET Core 代码生成器选项。
选项 |
说明 |
-m |
模型的名称。 |
-dc |
要使用的 DbContext 类。 |
-udl |
使用默认布局。 |
-outDir |
用于创建视图的相对输出文件夹路径。 |
--referenceScriptLibraries |
向“编辑”和“创建”页面添加 _ValidationScriptsPartial |
使用 -h
选项获取 dotnet aspnet-codegenerator razorpage
命令方面的帮助:
dotnet aspnet-codegenerator razorpage -h
有关详细信息,请查看 dotnet aspnet-codegenerator。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 以下代码演示了如何在开发中选择 SQLite 连接字符串,以及在生产中选择 SQL Server。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前面的代码不会在开发中调用 UseDeveloperExceptionPage
,因为 WebApplication
会在开发模式下调用 UseDeveloperExceptionPage
。
创建“Pages/Movies”文件夹:
- 右键单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
右键单击 Pages/Movies 文件夹 “添加”>“新基架...”。

在“新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“下一步”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“要使用的模型类”行中,输入 。
- 在“要使用的 DbContext 类:”行中,将类命名为 。
- 选择“完成”。

appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 以下代码演示了如何在开发中选择 SQLite 连接字符串,以及在生产中选择 SQL Server。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前面的代码不会在开发中调用 UseDeveloperExceptionPage
,因为 WebApplication
会在开发模式下调用 UseDeveloperExceptionPage
。
警告
本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。
创建和更新的文件
在搭建基架时,会创建以下文件:
- Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和“索引”。
Data/RazorPagesMovieContext.cs
创建的文件将在下一教程中说明。
基架进程将以下突出显示的代码添加到 Program.cs
文件中:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
本教程稍后将介绍 Program.cs
更改。
使用 EF 的迁移功能创建初始数据库架构
Entity Framework Core 中的迁移功能提供了一种方法来执行以下操作:
- 创建初始数据库架构。
- 以增量的方式更新数据库架构,使其与应用的数据模型保持同步。 保存数据库中的现有数据。
在此部分中,程序包管理器控制台 (PMC) 窗口用于:
在“工具”菜单中,选择“NuGet 包管理器”“包管理器控制台”。

在 PMC 中,输入以下命令:
Add-Migration InitialCreate
Update-Database
在“解决方案工具窗口”中,右键单击“RazorPagesMovie”项目,然后选择“在终端中打开”。
此时会打开“终端”窗口,并在包含 Program.cs 和 .csproj 文件的项目目录处显示命令提示符。
运行以下 .NET CLI 命令:
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
注意
对于 SQLite,Price
字段的列类型设置为 TEXT
。 后一个步骤中解决了此问题。
上述命令安装 Entity Framework Core 工具,并运行 migrations
命令以生成可创建初始数据库架构的代码。
将显示以下警告,该警告将在后面的步骤中解决:
No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'.
migrations
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
update
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,update
在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
检查通过依赖关系注入注册的上下文
ASP.NET Core 通过依赖关系注入进行生成。 在应用程序启动过程中通过依赖关系注入注册相关服务(例如 EF Core 数据库上下文)。 需要这些服务(如 Razor Pages)的组件通过构造函数参数提供。 本教程的后续部分介绍了用于获取数据库上下文实例的构造函数代码。
基架工具自动创建数据库上下文并将其注册到依赖关系注入容器。 基架将以下突出显示的代码添加到 Program.cs
文件中:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
数据上下文 RazorPagesMovieContext
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
}
}
前面的代码为实体集创建 DbSet<Movie> 属性。 在实体框架术语中,实体集通常与数据表相对应。 实体对应表中的行。
通过调用 DbContextOptions 对象中的一个方法将连接字符串名称传递到上下文。 进行本地开发时,配置系统在 appsettings.json
文件中读取连接字符串。
测试应用
运行应用并将 /Movies
追加到浏览器中的 URL (http://localhost:port/movies
)。
如果收到以下错误:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
缺少迁移步骤。
测试“新建”链接。

注意
可能无法在 Price
字段中输入十进制逗号。 若要使 jQuery 验证支持使用逗号(“,”)表示小数点的非英语区域设置,以及支持非美国英语日期格式,应用必须进行全球化。 有关全球化的说明,请参阅此 GitHub 问题。
测试“编辑”、“详细信息”和“删除”链接。
下一个教程介绍由基架创建的文件。
用完成的示例进行故障排除
如果遇到无法解决的问题,请将你的代码与完成的项目进行比较。 查看或下载已完成的项目(如何下载)。
后续步骤
在本节中,添加了用于管理数据库中的电影的类。 应用程序的模型类使用 Entity Framework Core (EF Core) 来处理数据库。 EF Core 是一种对象关系映射器 (O/RM),可简化数据访问。 首先要编写模型类,然后 EF Core 将创建数据库。
模型类称为 POCO 类(源自“简单传统 CLR 对象”),因为它们与 没有任何依赖关系。 它们定义数据库中存储的数据属性。
查看或下载示例代码(如何下载)。
添加数据模型
在解决方案资源管理器中,右键单击“RazorPagesMovie”项目>“添加”>“新建文件夹”。 将该文件夹命名为 Models
注册一个免费试用帐户。
右键单击 Models
文件夹。 选择“添加”“类” 。 将类命名“Movie”。
向 Movie
类添加以下属性:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
Movie
类包含:
- 添加名为
Models
的文件夹。
- 将类添加到名为
Models
的 Movie.cs
文件夹。
向 Movie
类添加以下属性:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
Movie
类包含:
运行以下 .NET CLI 命令:
dotnet tool install --global dotnet-ef
dotnet tool install --global dotnet-aspnet-codegenerator
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.SQLite
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
上述命令添加:
有关允许应用按环境配置其数据库上下文的多个环境配置指南,请参阅在 ASP.NET Core 中使用多个环境。
如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。 例如,以下项目文件使用适用于 .NET Core 的版本 5.0 和所列的 NuGet 包:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="5.0.0-*" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.0-*" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="5.0.0-*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.0-*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0-*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0-*" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.0-*" />
</ItemGroup>
</Project>
在“解决方案工具窗口”中,按 Control 并单击“RazorPagesMovie”项目,然后选择“添加”>“新建文件夹...”。将文件夹命名为 Models
。
按 Control 并单击 Models
文件夹,然后选择“添加”“新建文件...”。
在“新建文件”对话框中:
- 在左侧窗格中,选择“常规”。
- 在中间窗格中,选择“空类”。
- 将此类命名为“Movie”,然后选择“新建”。
向 Movie
类添加以下属性:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
生成项目以验证没有任何编译错误。
搭建“电影”模型的基架
在此部分,将搭建“电影”模型的基架。 确切地说,基架工具将生成页面,用于对“电影”模型执行创建、读取、更新和删除 (CRUD) 操作。
创建“Pages/Movies”文件夹:
- 右键单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
右键单击 Pages/Movies 文件夹 “添加”>“已搭建基架的新项”。

在“添加基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“添加”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“模型类”下拉列表中,选择“Movie (RazorPagesMovie.Models)。
- 在“数据上下文类”行中,选择 (加号)。
- 在“添加数据上下文”对话框中,生成类名 。
- 选择 添加 。

appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
下表详细说明了 ASP.NET Core 代码生成器选项。
选项 |
说明 |
-m |
模型的名称。 |
-dc |
要使用的 DbContext 类。 |
-udl |
使用默认布局。 |
-outDir |
用于创建视图的相对输出文件夹路径。 |
--referenceScriptLibraries |
向“编辑”和“创建”页面添加 _ValidationScriptsPartial |
使用 -h
选项获取 dotnet aspnet-codegenerator razorpage
命令方面的帮助:
dotnet aspnet-codegenerator razorpage -h
有关详细信息,请查看 dotnet aspnet-codegenerator。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 下面的代码演示如何将 IWebHostEnvironment 注入到 Startup
中。 注入 IWebHostEnvironment
,以便 ConfigureServices
可以在开发中使用 SQLite 并在生产中使用 SQL Server。
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
创建“Pages/Movies”文件夹:
- 按 Control 并单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
按 Control 并单击 Pages/Movies 文件夹 “添加”>“新基架...”。

在“新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“下一步”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“要使用的 DbContext 类:”行中,将类命名为 。
- 选择“完成”。

appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 下面的代码演示如何将 IWebHostEnvironment 注入到 Startup
中。 注入 IWebHostEnvironment
,以便 ConfigureServices
可以在开发中使用 SQLite 并在生产中使用 SQL Server。
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
警告
本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。
创建和更新的文件
在搭建基架时,会创建以下文件:
- Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和“索引”。
Data/RazorPagesMovieContext.cs
更新的文件
创建和更新的文件将在下一节中说明。
使用 EF 的迁移功能创建初始数据库架构
Entity Framework Core 中的迁移功能提供了一种方法来执行以下操作:
- 创建初始数据库架构。
- 以增量的方式更新数据库架构,使其与应用程序的数据模型保持同步。 保存数据库中的现有数据。
在此部分中,程序包管理器控制台 (PMC) 窗口用于:
在“工具”菜单中,选择“NuGet 包管理器”“包管理器控制台”。

在 PMC 中,输入以下命令:
Add-Migration InitialCreate
Update-Database
注意
对于 SQLite,Price
字段的列类型设置为 TEXT
。 后一个步骤中解决了此问题。
对于 SQL Server,前面的命令生成以下警告:“没有为实体类型“Movie”上的小数列“Price”指定类型”。 This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'.”
忽略警告,因为它将在后面的步骤中得到解决。
migrations
命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
update
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,update
在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
检查通过依赖关系注入注册的上下文
ASP.NET Core 通过依赖关系注入进行生成。 在应用程序启动过程中通过依赖关系注入注册相关服务(例如 EF Core 数据库上下文)。 需要这些服务(如 Razor Pages)的组件通过构造函数参数提供。 本教程的后续部分介绍了用于获取数据库上下文实例的构造函数代码。
基架工具自动创建数据库上下文并将其注册到依赖关系注入容器。
检查 Startup.ConfigureServices
方法。 基架添加了突出显示的行:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
RazorPagesMovieContext
为 EF Core 模型协调 Movie
功能,例如“创建”、“读取”、“更新”和“删除”。 数据上下文 (RazorPagesMovieContext
) 派生自 Microsoft.EntityFrameworkCore.DbContext。 数据上下文指定数据模型中包含哪些实体。
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (
DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
}
}
前面的代码为实体集创建 DbSet<Movie> 属性。 在实体框架术语中,实体集通常与数据表相对应。 实体对应表中的行。
通过调用 DbContextOptions 对象中的一个方法将连接字符串名称传递到上下文。 进行本地开发时,配置系统在 appsettings.json
文件中读取连接字符串。
测试应用
运行应用并将 /Movies
追加到浏览器中的 URL (http://localhost:port/movies
)。
如果收到以下错误:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
缺少迁移步骤。
测试“创建”链接。

注意
可能无法在 Price
字段中输入十进制逗号。 若要使 jQuery 验证支持使用逗号(“,”)表示小数点的非英语区域设置,以及支持非美国英语日期格式,应用必须进行全球化。 有关全球化的说明,请参阅此 GitHub 问题。
测试“编辑”、“详细信息”和“删除”链接。
Entity Framework Core 的 SQL 日志记录
日志配置通常由 Logging
文件的 appsettings.{Environment}.json
部分提供。 若要记录 SQL 语句,请将 "Microsoft.EntityFrameworkCore.Database.Command": "Information"
添加到 appsettings.Development.json
文件:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
}
},
"AllowedHosts": "*"
}
有了前面的 JSON,SQL 语句就会显示在命令行和 Visual Studio 输出窗口中。
有关详细信息,请参阅 .NET Core 和 ASP.NET Core 中的日志记录和此 GitHub 问题。
下一个教程介绍由基架创建的文件。
后续步骤
在该部分,会添加类管理影片。 应用程序的模型类使用 Entity Framework Core (EF Core) 来处理数据库。 EF Core 是一种对象关系映射器 (O/RM),可简化数据访问。
模型类称为 POCO 类(源自“简单传统 CLR 对象”),因为它们与 EF Core 没有任何依赖关系。 它们定义数据库中存储的数据属性。
查看或下载示例代码(如何下载)。
警告
本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。
添加数据模型
右键单击“RazorPagesMovie”项目>“添加”>“新建文件夹”。 将该文件夹命名为 Models
注册一个免费试用帐户。
右键单击 Models
文件夹。 选择“添加”“类” 。 将类命名“Movie”。
向 Movie
类添加以下属性:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
- 添加名为
Models
的文件夹。
- 将类添加到名为
Models
的 Movie.cs
文件夹。
向 Movie
类添加以下属性:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
运行以下 .NET CLI 命令:
dotnet tool install --global dotnet-ef --version 3.1.9
dotnet tool install --global dotnet-aspnet-codegenerator --version 3.1.4
dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 3.1.9
dotnet add package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore --version 3.1.9
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 3.1.4
dotnet add package Microsoft.EntityFrameworkCore.Design --version 3.1.9
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 3.1.9
dotnet add package Microsoft.Extensions.Logging.Debug --version 3.1.9
上述命令添加:
- aspnet-codegenerator 基架工具。
- 适用于 .NET CLI 的 Entity Framework Core 工具。
- EF Core SQLite 提供程序,它将 EF Core 包作为依赖项进行安装。
- 基架需要的包:
Microsoft.VisualStudio.Web.CodeGeneration.Design
和 Microsoft.EntityFrameworkCore.SqlServer
。
有关允许应用按环境配置其数据库上下文的多个环境配置指南,请参阅在 ASP.NET Core 中使用多个环境。
如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。 例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
</ItemGroup>
</Project>
添加数据库上下文类
在 RazorPagesMovie 项目中,创建一个名为 Data 的新文件夹。
将以下 RazorPagesMovieContext
类添加到“Data”文件夹:
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (
DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
}
}
前面的代码为实体集创建 DbSet
属性。 在 Entity Framework 中,实体集通常与数据表相对应,具体实体与表中的行相对应。 直至在后续步骤中添加依赖项,代码才可编译。
添加数据库连接字符串
向 appsettings.json
文件添加一个连接字符串,如以下突出显示的代码所示:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Data Source=MvcMovie.db"
}
}
注册数据库上下文
在 using
顶部添加以下 Startup.cs
语句:
using RazorPagesMovie.Data;
using Microsoft.EntityFrameworkCore;
使用 中的Startup.ConfigureServices
容器注册数据库上下文。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
向 Movie
类添加以下属性:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
Movie
类包含:
DataAnnotations 会在后续教程中介绍。
生成项目以验证没有任何编译错误。
搭建“电影”模型的基架
在此部分,将搭建“电影”模型的基架。 确切地说,基架工具将生成页面,用于对“电影”模型执行创建、读取、更新和删除 (CRUD) 操作。
创建“Pages/Movies”文件夹:
- 右键单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
右键单击 Pages/Movies 文件夹 “添加”>“已搭建基架的新项”。

在“添加基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“添加”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“模型类”下拉列表中,选择“Movie (RazorPagesMovie.Models)。
- 在数据上下文类行中,选择“+”(加号)并将生成的名称从 RazorPagesMovie.
Models
.RazorPagesMovieContext 更改为 RazorPagesMovie.Data.RazorPagesMovieContext。 不需要此更新。 它创建具有正确命名空间的数据库上下文类。
- 选择 添加 。

appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
打开项目目录(包含 Program.cs
、Startup.cs
和 .csproj
文件)的命令窗口。
对于 Windows:运行下面的命令:
dotnet aspnet-codegenerator razorpage -m Movie -dc RazorPagesMovieContext -udl -outDir Pages\Movies --referenceScriptLibraries
对于 macOS 和 Linux:运行下面的命令:
dotnet aspnet-codegenerator razorpage -m Movie -dc RazorPagesMovieContext -udl -outDir Pages/Movies --referenceScriptLibraries
下表详细说明了 ASP.NET Core 代码生成器选项:
选项 |
说明 |
-m |
模型的名称。 |
-dc |
要使用的 DbContext 类。 |
-udl |
使用默认布局。 |
-outDir |
用于创建视图的相对输出文件夹路径。 |
--referenceScriptLibraries |
向“编辑”和“创建”页面添加 _ValidationScriptsPartial |
使用 -h
选项获取 dotnet aspnet-codegenerator razorpage
命令方面的帮助:
dotnet aspnet-codegenerator razorpage -h
有关详细信息,请查看 dotnet aspnet-codegenerator。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 下面的代码演示如何将 IWebHostEnvironment 注入到 Startup 中。 注入 IWebHostEnvironment
,以便 ConfigureServices
可以在开发中使用 SQLite 并在生产中使用 SQL Server。
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
创建“Pages/Movies”文件夹:
- 右键单击 Pages 文件夹 “添加”>“新建文件夹”。
- 将文件夹命名为“Movies”。
右键单击 Pages/Movies 文件夹 “添加”>“新基架...”。

在“新基架”对话框中,依次选择“使用实体框架的 Pages (CRUD)”Razor“下一步”。

完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:
- 在“模型类”下拉列表中,选择或键入“Movie (RazorPagesMovie.Models)”。
- 在“数据上下文类”行中,键入新类的名称“RazorPagesMovie.Data.RazorPagesMovieContext”。 不需要此更新。 它创建具有正确命名空间的数据库上下文类。
- 选择 添加 。

appsettings.json
文件通过用于连接到本地数据的连接字符串进行更新。
运行以下 .NET CLI 命令:
dotnet tool install --global dotnet-ef
以上命令将添加适用于 .NET CLI 的 Entity Framework Core 工具。 有关详细信息,请参阅 Entity Framework Core 工具参考 - .NET CLI。
将 SQLite 用于开发,将 SQL Server 用于生产
选择 SQLite 后,模板生成的代码便可用于开发。 下面的代码演示如何将 IWebHostEnvironment 注入到 Startup 中。 注入 IWebHostEnvironment
,以便 ConfigureServices
可以在开发中使用 SQLite 并在生产中使用 SQL Server。
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
创建的文件
在搭建基架时,会创建并更新以下文件:
- Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和“索引”。
Data/RazorPagesMovieContext.cs
已更新
创建和更新的文件将在下一节中说明。
在搭建基架时,会创建并更新以下文件:
- Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和“索引”。
Data/RazorPagesMovieContext.cs
已更新
创建和更新的文件将在下一节中说明。
在搭建基架时,会创建以下文件:
- Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和“索引”。
创建的文件将在下一节中说明。
初始迁移
在此部分中,程序包管理器控制台 (PMC) 用于:
在“工具”菜单中,选择“NuGet 包管理器”“包管理器控制台”。

在 PMC 中,输入以下命令:
Add-Migration InitialCreate
Update-Database
如果尚未安装 dotnet ef
,请安装它作为全局工具:
dotnet tool install --global dotnet-ef
有关 EF Core 的 CLI 的详细信息,请参阅 .NET CLI 的 EF Core 工具引用。
运行以下 .NET CLI 命令:
dotnet ef migrations add InitialCreate
dotnet ef database update
前面的命令生成以下警告:“No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'.”
忽略警告,因为它将在后面的步骤中得到解决。
migrations 命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext
中指定的模型。 InitialCreate
参数用于为迁移命名。 可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。
update
命令在尚未应用的迁移中运行 Up
方法。 在这种情况下,update
在用于创建数据库的 Up
文件中运行 Migrations/<time-stamp>_InitialCreate.cs
方法。
检查通过依赖关系注入注册的上下文
ASP.NET Core 通过依赖关系注入进行生成。 在应用程序启动过程中通过依赖关系注入注册相关服务(例如 EF Core 数据库上下文)。 需要这些服务(如 Razor Pages)的组件通过构造函数参数提供。 本教程的后续部分介绍了用于获取数据库上下文实例的构造函数代码。
基架工具自动创建数据库上下文并将其注册到依赖关系注入容器。
检查 Startup.ConfigureServices
方法。 基架添加了突出显示的行:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
RazorPagesMovieContext
为 EF Core 模型协调 Movie
功能,例如“创建”、“读取”、“更新”和“删除”。 数据上下文 (RazorPagesMovieContext
) 派生自 Microsoft.EntityFrameworkCore.DbContext。 数据上下文指定数据模型中包含哪些实体。
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (
DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
}
}
前面的代码为实体集创建 DbSet<Movie> 属性。 在实体框架术语中,实体集通常与数据表相对应。 实体对应表中的行。
通过调用 DbContextOptions 对象中的一个方法将连接字符串名称传递到上下文。 进行本地开发时,配置系统在 appsettings.json
文件中读取连接字符串。
测试应用
- 运行应用并将
/Movies
追加到浏览器中的 URL (http://localhost:port/movies
)。
如果收到错误:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
缺少迁移步骤。
测试“创建”链接。

注意
可能无法在 Price
字段中输入十进制逗号。 若要使 jQuery 验证支持使用逗号(“,”)表示小数点的非英语区域设置,以及支持非美国英语日期格式,应用必须进行全球化。 有关全球化的说明,请参阅此 GitHub 问题。
测试“编辑”、“详细信息”和“删除”链接。
下一个教程介绍由基架创建的文件。
后续步骤