在本教程中,添加了用于管理数据库中的电影的类。 应用的模型类使用 Entity Framework Core (EF Core) 来处理数据库。 EF Core 是一种对象关系映射器 (ORM),可简化数据访问。 首先要编写模型类,然后 EF Core 将创建数据库。

模型类称为 POCO 类(源自“简单传统 CLR 对象” ),因为它们与 EF Core 没有任何依赖关系。 它们定义数据库中存储的数据属性。

添加数据模型

  1. 在“解决方案资源管理器”中,右键单击“RazorPagesMovie”项目 >“添加” > “新建文件夹”。 将文件夹命名为“Models”。

  2. 右键单击“Models”文件夹。 选择“添加” > “类” 。 将类命名“Movie”。

  3. 向 Movie 类添加以下属性:

    C#

    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 类包含:

  • 数据库需要 ID 字段以获取主键。

  • [DataType] 属性,用于指定 ReleaseDate 属性中的数据类型。 通过此特性:

    • 用户无需在日期字段中输入时间信息。

    • 仅显示日期,而非时间信息。

DataAnnotations 会在后续教程中介绍。

生成项目以验证没有任何编译错误。

搭建“电影”模型的基架

在此部分,将搭建“电影”模型的基架。 确切地说,基架工具将生成页面,用于对“电影”模型执行创建、读取、更新和删除 (CRUD) 操作。

  1. 添加基架工具所需的 NuGet 包 Microsoft.EntityFrameworkCore.Design

    1. 在“工具”菜单中,依次选择“NuGet 包管理器”>“管理解决方案的 NuGet 包” NuGet 包管理器 - 管理

    2. 选择“浏览”选项卡。

    3. 选中“包括预发行版”

    4. 输入并从列表中选择 Microsoft.EntityFrameworkCore.Design

    5. 选中“项目”,然后选择“安装”

    6. 在“许可证接受”对话框中,选择“我接受” 。 NuGet 包管理器 - 添加包

  2. 创建“Pages/Movies”文件夹:

    1. 右键单击“Pages”文件夹 >“添加”>“新建文件夹”。

    2. 将文件夹命名为“Movies”。

  3. 右键单击“Pages/Movies”文件夹 >“添加”>“新搭建基架的项目”。

    已搭建基架的新项

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

    添加基架

  5. 完成“添加使用实体框架的 Razor 页面 (CRUD)”对话框:

    添加 Razor Pages

    如果收到错误消息,提示需要安装 Microsoft.EntityFrameworkCore.SqlServer 包,请重复从“添加”>“新建基架项”开始的步骤 。

    1. 在“添加数据上下文”对话框中,生成类名 RazorPagesMovie.Data.RazorPagesMovieContext

    2. 在“模型类”下拉列表中,选择“Movie (RazorPagesMovie.Models)” 。

    3. 在“数据上下文类”行中,选择 +(加号) 。

    4. 选择“添加”。

appsettings.json 文件通过用于连接到本地数据的连接字符串进行更新。

创建和更新的文件

在搭建基架时,会创建以下文件:

  • Pages/Movies:“创建”、“删除”、“详细信息”、“编辑”和 Index。

  • Data/RazorPagesMovieContext.cs

创建的文件将在下一教程中说明。

基架进程将以下突出显示的代码添加到 Program.cs 文件中:

C#
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")));
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    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) 窗口用于:

  • 添加初始迁移。

  • 使用初始迁移来更新数据库。

  1. 从“工具”菜单中,选择“NuGet 包管理器”>“包管理器控制台” 。

    PMC 菜单

  2. 在 PMC 中,输入以下命令:

    PowerShell

    Add-Migration InitialCreate
    Update-Database
    
    

对于 SQL Server,前面的命令生成以下警告:

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 在用于创建数据库的 Migrations/<time-stamp>_InitialCreate.cs 文件中运行 Up 方法。

检查通过依赖关系注入注册的上下文

ASP.NET Core 通过依赖关系注入进行生成。 在应用程序启动过程中,通过依赖注入注册相关服务(例如 EF Core 数据库上下文)。 需要这些服务(如 Razor Pages)的组件通过构造函数参数提供。 本教程的后续部分介绍了用于获取数据库上下文实例的构造函数代码。

基架工具自动创建数据库上下文并将其注册到依赖关系注入容器。 基架将以下突出显示的代码添加到 Program.cs 文件中:

C#
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")));
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    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

  • 派生自 Microsoft.EntityFrameworkCore.DbContext

  • 指定数据模型中包含哪些实体。

  • 为 Movie 模型协调 EF Core 功能,例如“创建”、“读取”、“更新”和“删除”。

C#
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 文件中读取连接字符串。

生成应用

构建应用程序。 编译器会生成多个 nullable 警告。 .NET 6 的已发布版本将在没有这些警告的情况下构建代码基架。 有关详细信息,请参阅此 GitHub 问题可为 null 的引用类型

修复警告消息

可以跳过此部分并忽略警告。 发布 .NET 6 时,生成的代码将不包含编译器警告。

RazorPagesMovieContext 将生成如下警告:

警告在退出构造函数时,CS8618 不可为 null 的属性“Movie”必须包含非 null 值。 请考虑将属性声明为可为 null。

若要修复警告,请应用建议,并声明 Movie 属性可为 null

C#
        public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
    }
}

? 将属性声明为可为 null。

另一种方法是禁用 CS8618 warning with pragma 语句:

C#
    public class RazorPagesMovieContext : DbContext
    {
#pragma warning disable CS8618
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
#pragma warning restore CS8618 
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

对于 Razor Pages C# 代码隐藏文件中的警告,请使用 pragma C# 预处理器指令禁用警告。 例如,在 Pages/Movies/Index.cshtml.cs 文件中使用以下突出显示的代码:

C#
namespace RazorPagesMovie.Pages.Movies
{
#pragma warning disable CS8618
#pragma warning disable CS8604    public class IndexModel : PageModel
    {
        private readonly RazorPagesMovie.Data.RazorPagesMovieContext _context;

        public IndexModel(RazorPagesMovie.Data.RazorPagesMovieContext context)
        {
            _context = context;
        }

        public IList<Movie> Movie { get; set; }

        public async Task OnGetAsync()
        {
            Movie = await _context.Movie.ToListAsync();
        }
    }
#pragma warning disable CS8618#pragma warning disable CS8604}

Pages/Movies/Delete.cshtml.cs 文件需要以下 pragma 语句:

C#
#pragma warning disable CS8618
#pragma warning disable CS8601
#pragma warning disable CS8602
#pragma warning disable CS8604
// Class
#pragma warning restore CS8618
#pragma warning restore CS8601
#pragma warning restore CS8602
#pragma warning restore CS8604

忽略 NU1603 包不匹配警告,这些警告将在发布 .NET 6 时修复。

测试应用

  1. 运行应用并将 /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'.
    

    缺少迁移步骤

  2. 测试“创建”链接。

    创建页面

     备注

    可能无法在 Price 字段中输入十进制逗号。 若要使 jQuery 验证支持使用逗号(“,”)表示小数点的非英语区域设置,以及支持非美国英语日期格式,应用必须进行全球化。 有关全球化的说明,请参阅此 GitHub 问题

  3. 测试“编辑”、“详细信息”和“删除”链接。

Entity Framework Core 的 SQL 日志记录

日志配置通常由 appsettings {Environment}.json 文件的 Logging 部分提供 。 若要记录 SQL 语句,请将 "Microsoft.EntityFrameworkCore.Database.Command": "Information" 添加到 appsettings.Development.json 文件:

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 问题

下一个教程介绍由基架创建的文件。

用完成的示例进行故障排除

如果遇到无法解决的问题,请将你的代码与完成的项目进行比较。 查看或下载已完成的项目如何下载)。

其他资源

上一篇:入门 下一篇:基架 Razor Pages