使用模型
在 .NET 应用程序中处理数据时,你有以下的选择:你可以在记录集或数据集结构中围绕着应用程序移动数据。也可以将应用程序关注的事物(或实体)表示为类,并将这些实例用作数据库中各行的数据的容器。
建议使用第二种方法,因为它使你能够以强类型的方式处理数据 - 这具有编译时检查从而减少运行时错误,和提供更高质量代码的双重好处。在将数据表示为 Person.FirstName
而不是 ds.Tables[0].Columns["FirstName"].Rows[0]
的情况下, 对代码进行推理和维护要容易得多。 后者是你访问 ADO.NET DataSet 对象中的数据项的方式。
总的来说,应用程序的实体的代码表示形式称为Model(模型)。Bakery 应用程序目前涉 Fourth Coffee 商店销售的产品,所以该模型中包含一个类: Product
。
创建模型
添加一个新文件夹到应用程序的根目录并命名为 Models
。 如果你已经安装 "C# Extensions" 扩展, 在该文件夹上右键并选择 New C# Class
:
出现提示时,在对话框中将该类命名为 Product
,然后确定。 生成的文件应该包含有以下的内容:
amespace Bakery.Models
{
public class Product
{
}
}
添加以下突出显示的行到 Product
类中:
namespace Bakery.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string ImageName { get; set; }
}
}
Product 类的属性取自原始示例站点附带的数据库中的 Products 表的列名称。大多数的现代Web应用程序使用数据访问技术自动将数据库中的表和列与应用程序中模型类及其属性进行映射,从而实现数据库与模型类之间的双向数据传输。这些组件被称为对象关系映射 - ORM。功能齐全的ORM还可以生成SQL命令并在数据库上执行, 以及提供事务管理和迁移等其他服务。
建议与 ASP.NET Core 应用程序一起使用的 ORM 是 Entity Framework Core (EF Core)。在下一步,你将要把它添加到应用程序中来。
添加 Entity Framework Core
EF Core 包含许多与特定数据库一起工作的提供程序。很多提供程序由第三方进行维护。 EF Core 团队维护 SQL Server 和 SQLite 的提供程序 - SQLite是一个基于文件的平台数据库,将在本练习中使用。
默认情况下, EF Core 不包含中项目模板中。它是一个 NuGet 包,可以通过 dotnet add package
命令进行安装。 要把 SQLite 提供程序安装到 Bakery 站点中,请从终端执行以下命令:
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
终端将在操作成功完成后通知你。
添加和注册上下文
用于和数据库通信的主要 EF Core 组件是一个派生自 DbContext的类,称为上下文(context)。 上下文表示与数据库的会话,并提供一个 API 用于和数据库进行通信,具有以下的功能:
- 数据库连接
- 数据操作, 如查询和持久性
- 更改跟踪
- 模型建筑
- 数据映射
- 对象缓存
- 事务管理
要添加上下文,先在项目的根文件夹中创建名为 Data
的文件夹。然后在该文件夹添加名为 BakeryContext.cs
的 C# 类文件,修改其内容如以下所示:
using Bakery.Models;
using Microsoft.EntityFrameworkCore;
namespace Bakery.Data
{
public class BakeryContext : DbContext
{
public DbSet<Product> Products { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(@"Data source=Bakery.db");
}
}
}
这是你用于处理数据的上下文,这个上下文有一个属性 - 一个名为 Products
的 DbSet
。 DbSet
类映射到数据库中的表。
OnConfiguring 方法为你提供了一个用于配置上下文的位置。在这个情况下,你已经将上下文配置为使用 SQLite 提供程序,并指定了要使用的连接字符串。
使用上下文时,你可以在任何需要的地方进行实例化,例如:
using(var context = new BakeryContext())
{
// do something with data
}
但是,在 ASP.NET Core 应用程序中使用上下文的推荐方法是将其注册到依赖注册系统,使其作为“服务” 提供。服务注册在 Startup 类的 ConfigureServices
方法中进行。
要完成这一步,打开 Startup.cs
文件并添加一个 using
指令, 将 Bakery.Data
名字空间引入作用域中:
...
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Bakery.Data;
namespace Bakery
{
public class Startup
{
...
然后将突出显示的代码行添加到下面的 ConfigureServices
方法中:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<BakeryContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
现在通过类构造函数注入上下文就可以在 PageModel
类中使用它了。 无需管理上下文的生命周期。 AddDbContext
方法使用 Scoped 生命周期注册上下文, 这意味着将为整个请求提供新的上下文, 服务容器将负责确保正确地处理它。
摘要
你现在有了一个模型(小型,但仍然是模型),和一个 EF Core 上下文。 你现在需要的只是一个数据库。 在下一节, 你将了解如何使用 EF Core 的迁移功能来创建这个数据库。