练习 - 现有数据库反向工程
Contoso Pizza 的经理要求你添加一个终结点,以便公司可以在其应用中显示优惠券。 这些优惠券位于现有数据库中。 在本单元中,你将从现有数据库创建基架并修改生成的实体类。
检查促销数据库
查看将用于生成基架代码的数据库:
在“资源管理器”窗格中展开“Promotions”目录,右键单击“Promotions.db”文件,然后选择“打开数据库”。
新数据库将在“SQLITE 资源管理器”文件夹中打开。
在“SQLite 资源管理器”文件夹中展开 Promotions.db 和“优惠券”节点。 请注意数据架构。
右键单击“优惠券”节点,选择“显示表”。 检查优惠券数据。
搭建促销上下文和优惠券模型的基架
现在,使用数据库来搭建代码基架:
运行以下命令:
dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models
上述命令:
- 使用提供的连接字符串搭建
DbContext
和模型类基架。 - 指定使用
Microsoft.EntityFrameworkCore.Sqlite
数据库提供程序。 - 为生成的
DbContext
和模型类指定目录。
注意
在本练习中,可以忽略有关连接字符串在源代码中的警告。 在处理实际的代码时,请始终将连接字符串存储在安全位置。
- 使用提供的连接字符串搭建
打开 Models\Coupon.cs 并检查基架模型。
using System; using System.Collections.Generic; namespace ContosoPizza.Models { public partial class Coupon { public int Id { get; set; } public string Description { get; set; } = null!; public DateOnly? Expiration { get; set; } } }
由于与 C# 相比,SQLite 的类型集有限,因此基架工具对使用哪些 C# 类型进行了推断。 例如,
Expiration
数据库列被定义为字符串,因为 SQLite 没有日期数据类型。 基架工具根据数据库中的数据推断 C# 类型应当是DateOnly?
。提示
如果数据库发生更改,可以生成新的基架文件。 生成的文件每次都会被覆盖,但会创建为
partial
类,因此你可以在自己的单独文件中使用自定义属性和行为来扩展它们。
添加优惠券终结点
在测试基架代码之前,需要向 API 添加一个终结点。 因此,接下来你将添加一个新的 API 控制器。
若要更好地了解 API 控制器的工作原理,请参阅使用 ASP.NET Core 控制器创建 Web API。
在 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
方法返回所有优惠券。
同样在 Program.cs 中,将
// Add the PromotionsContext
注释替换为以下代码:builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
此代码将
PromotionsContext
注册到依赖项注入系统。保存所有更改并使用
dotnet run
运行应用。
测试终结点
现在我们已添加终结点,请测试优惠券操作:
像之前的练习一样转到 API 的 Swagger UI(或刷新浏览器中的现有 UI)。
在“优惠券”标题下,展开“GET”操作并选择“试用”按钮。
选择“执行”。 响应正文显示数据库中的优惠券:
[ { "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
是日期/时间值。
就这么简单! 你已经基于现有数据库创建并修改了基架!