一、创建MVC空项目
(步骤略)
二、创建数据库
- 打开VS2022自带的SQL Server对象资源管理器窗口,任选一个数据库服务器创建数据库。**注意:**数据表中如果某字段包含有中文,该字段必须设置为NVARCHAR类型,否则中文全部会变为问号。
- 数据库的访问地址,可在该数据库属性窗口中的"连接字符串"栏查看,其中(localdb)\MSSQLLocalDB部分即为数据库连接地址,可在Navicat中填入后直连,账号、密码留空即可。
- 使用Navicat创建数据表和数据。
三、基于数据表生成Models
- 根据VS版本安装对应版本的NuGet程序包,三个程序包,分别为:Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools

- 从工具栏打开程序包管理控制台,输入以下指令:
bash
Scaffold-DbContext "Server=(localdb)\MSSQLLocalDB;Database=Test;Integrated Security=True;TrustServerCertificate=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
此时,Models文件夹下会根据已有数据表快速生成对应数据表名称的cs文件。与此同时,还会多生成一个TestContext.cs(Test为数据库名称),该文件存储数据库信息,并且是控制器中实例化访问数据库的关键文件。

3.如果数据库发生了改变,如新增了Goods、Customers数据表,需要同步更新到模型Models文件夹中,则继续在程序包管理控制台,输入以下指令:
bash
Scaffold-DbContext "Server=(localdb)\MSSQLLocalDB;Database=Test;Integrated Security=True;TrustServerCertificate=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force -NoOnConfiguring -Tables "Users","Goods", "Customers"
其中,-Force (或 -f):会强制覆盖已存在的实体类文件。-NoOnConfiguring:防止DbContext产生配置冲突。-Tables (或 -t):只更新或生成特定的表,而不是所有表,该参数对大型数据库非常有用。-ContextDir:如果想把 DbContext 类文件生成到与实体类文件不同的目录,可以使用此参数指定目录。
此外,测试发现,-Tables 参数的行为是"覆盖"而非"追加",它是"白名单",每次使用都会根据这个名单完全重新生成模型,要始终在 -Tables 后列出所有所有需要的表,包括原有的和新加的,用逗号分隔。
四、通过控制器访问数据库
- 注册TestContext
(1)在Program.cs文件中的builder.Services.AddControllersWithViews();和var app = builder.Build();之间插入一段代码:
csharp
// Add services to the container.
builder.Services.AddControllersWithViews();
// >>> 就是这里!添加这行代码来注册你的 TestContext <<<
builder.Services.AddDbContext<TestContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
// 如果你的连接字符串不叫 "DefaultConnection",请替换为实际的名称
var app = builder.Build();
注意:如果不添加上述代码,就会报错如下:

(2)在appsettings.json文件中配置"DefaultConnection":
bash
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=Test;Integrated Security=True;TrustServerCertificate=True"
}
- 创建新控制器DBTestController.cs,在控制器的类中编写如下代码:
csharp
// 1. 声明一个私有字段来持有TestContext
private readonly TestContext _context;
// 2. 通过构造方法注入TestContext(依赖注入)
public DBTestController(TestContext context)
{
_context = context;
}
// 3. 编写Index Action方法
// GET: DBTestController
public async Task<IActionResult> Index()
{
// 从数据库中异步获取User表的所有数据
// 假设生成的DbSet属性名为Users (通常为表名的复数形式)
var users = await _context.Users.ToListAsync();
// 将获取到的用户列表传递给视图
return View(users);
}
- 右击上述控制器中的Index方法,添加视图,即可自动生成空视图。在该视图中即可接收和处理数据库查询内容。代码如下:
html
@* 指定视图从控制器接收的模型数据类型为IEnumerable<User> *@
@model IEnumerable<User>
@{
ViewData["Title"] = "用户数据表";
}
<h1>用户表</h1>
<table class="table">
<thead>
<tr>
@* 生成表头,根据你的User实体属性修改 *@
<th>@Html.DisplayNameFor(model => model.Id)</th>
<th>@Html.DisplayNameFor(model => model.Name)</th>
<th>@Html.DisplayNameFor(model => model.Description)</th>
@* ... 添加其他你需要的字段 ... *@
</tr>
</thead>
<tbody>
@* 循环遍历模型中的每一个User对象 *@
@foreach (var item in Model)
{
<tr>
@* 显示每个字段的数据 *@
<td>@Html.DisplayFor(modelItem => item.Id)</td>
<td>@Html.DisplayFor(modelItem => item.Name)</td>
<td>@Html.DisplayFor(modelItem => item.Description)</td>
@* ... 显示其他字段 ... *@
</tr>
}
</tbody>
</table>