练习 - 现有数据库反向工程

已完成

Contoso Pizza 的经理要求你添加一个终结点,以便公司可以在其应用中显示优惠券。 这些优惠券位于现有数据库中。 在本单元中,你将从现有数据库创建基架并修改生成的实体类。

检查促销数据库

查看将用于生成基架代码的数据库:

  1. 在“资源管理器”窗格中展开“Promotions”目录,右键单击“Promotions.db”文件,然后选择“打开数据库”。

    新数据库将在“SQLITE 资源管理器”文件夹中打开。

  2. 在“SQLite 资源管理器”文件夹中展开 Promotions.db 和“优惠券”节点。 请注意数据架构。

  3. 右键单击“优惠券”节点,选择“显示表”。 检查优惠券数据。

搭建促销上下文和优惠券模型的基架

现在,使用数据库来搭建代码基架:

  1. 运行以下命令:

    dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models   
    

    上述命令:

    • 使用提供的连接字符串搭建 DbContext 和模型类基架。
    • 指定使用 Microsoft.EntityFrameworkCore.Sqlite 数据库提供程序。
    • 为生成的 DbContext 和模型类指定目录。

    注意

    在本练习中,可以忽略有关连接字符串在源代码中的警告。 在处理实际的代码时,请始终将连接字符串存储在安全位置。

  2. 打开 Models\Coupon.cs。 Expiration 属性定义为字符串,因为 SQLite 没有日期/时间数据类型。 将 Expiration 类型从 string? 更改为 DateTime。 EF Core 管理从日期/时间数据到字符串数据的转换。

    using System;
    using System.Collections.Generic;
    
    namespace ContosoPizza.Models
    {
        public partial class Coupon
        {
            public long Id { get; set; }
            public string Description { get; set; } = null!;
            public DateTime Expiration { get; set; }
        }
    }
    

    提示

    如果数据库发生更改,可以生成新的基架文件。 生成的文件每次都会被覆盖,但会创建为 partial 类,因此你可以在自己的单独文件中使用自定义属性和行为来扩展它们。

添加优惠券终结点

在测试基架代码之前,需要向 API 添加一个终结点。 那么接下来请添加新的 API 控制器。

若要更好地了解 API 控制器的工作原理,请参阅使用 ASP.NET Core 控制器创建 Web API

  1. 在 Controllers 文件夹中,添加名为 CouponController.cs 的文件,其中包含以下代码:

    using ContosoPizza.Data;
    using ContosoPizza.Models;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class CouponController : ControllerBase
    {
        PromotionsContext _context;
    
        public CouponController(PromotionsContext context)
        {
            _context = context;
        }
    
        [HttpGet]
        public IEnumerable<Coupon> Get()
        {
            return _context.Coupons
                .AsNoTracking()
                .ToList();
        }
    }
    

    此代码会向 API 添加一个 api/coupon 终结点。

    在上述代码中:

    • PromotionsContext 对象注入到构造函数中。
    • Get 方法返回所有优惠券。
  2. 同样在 Program.cs 中,将 // Add the PromotionsContext 注释替换为以下代码:

    builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
    

    此代码将 PromotionsContext 注册到依赖项注入系统。

  3. 保存所有更改并使用 dotnet run 运行应用。

测试终结点

现在我们已添加终结点,请测试优惠券操作:

  1. 像之前的练习一样转到 API 的 Swagger UI(或刷新浏览器中的现有 UI)。

  2. 在“优惠券”标题下,展开“GET”操作并选择“试用”。

  3. 选择“执行”。 响应正文显示数据库中的优惠券:

    [
    {
        "id": 1,
        "description": "Buy 1 get 1 free",
        "expiration": "2025-01-01T00:00:00"
    },
    {
        "id": 2,
        "description": "4 large pizzas for $40",
        "expiration": "2024-06-30T00:00:00"
    }
    ]
    

    请注意,expiration 是日期/时间值。

就这么简单! 你已经从现有数据库创建并修改了基架!