【备忘】ASP.Net MVC无缝对接SQL Server数据库设置步骤

一、创建MVC空项目

(步骤略)

二、创建数据库

  1. 打开VS2022自带的SQL Server对象资源管理器窗口,任选一个数据库服务器创建数据库。**注意:**数据表中如果某字段包含有中文,该字段必须设置为NVARCHAR类型,否则中文全部会变为问号。
  2. 数据库的访问地址,可在该数据库属性窗口中的"连接字符串"栏查看,其中(localdb)\MSSQLLocalDB部分即为数据库连接地址,可在Navicat中填入后直连,账号、密码留空即可。
  3. 使用Navicat创建数据表和数据。

三、基于数据表生成Models

  1. 根据VS版本安装对应版本的NuGet程序包,三个程序包,分别为:Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools
  2. 从工具栏打开程序包管理控制台,输入以下指令:
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 后列出所有所有需要的表,包括原有的和新加的,用逗号分隔。

四、通过控制器访问数据库

  1. 注册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"
  }
  1. 创建新控制器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);
        }
  1. 右击上述控制器中的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>
相关推荐
努力学编程呀(๑•ี_เ•ี๑)2 小时前
宝塔上的数据库用Navicat如何连接
数据库
l1t2 小时前
AI关于MySQL 能否存储数组的回答
数据库·mysql
菩提小狗2 小时前
小迪安全_第4天:基础入门-30余种加密编码进制&Web&数据库&系统&代码&参数值|小迪安全笔记|网络安全|
前端·网络·数据库·笔记·安全·web安全
Albert Edison2 小时前
【MySQL】使用C/C++语言连接数据库
c语言·数据库·mysql
高一要励志成为佬2 小时前
【数据库】第二章 关系数据库 各种概念
数据库
youshang520i2 小时前
Gbase 8s 不能参考一个未设日志的外在数据库
数据库
宇宙的尽头是PYTHON2 小时前
开窗函数简单的排序row_number() rank() densite()
数据库
心止水j3 小时前
hbase 电商2
数据库·windows·hbase
Blockbuater_drug3 小时前
SDF 格式文件的前世今生:从化学信息学基石到 AI 时代的分子通用语言
数据库·人工智能·化学信息学·sdf格式