写在前面
本文我们通过 .net core 搭建 web api 项目。 即: 提供后台服务api接口。 我使用的操作系统是win10.
操作步骤
前置环境安装
1. 安装 .net core sdk
https://dotnet.microsoft.com/zh-cn/download/dotnet
安装好之后, 将其配置在系统的Path路径。
2. 安装 vs studio 2022
VisualStudioSetup.rar
3. 安装 sqlserve 2008
https://www.cnblogs.com/linhuaming/p/15819085.html
https://blog.csdn.net/weixin_43468667/article/details/89073817
搭建步骤
创建测试数据库
CREATE TABLE [dbo].[test] (
[id] int NOT NULL,
[name] varchar(255) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK__test__3213E83F7F60ED59] PRIMARY KEY CLUSTERED ([id])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
)
ON [PRIMARY]
GO
ALTER TABLE [dbo].[test] SET (LOCK_ESCALATION = TABLE)
新建web api 项目
安装EF依赖
打开NuGet包管理器
分别输入以下命令:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
项目结构如下
配置数据库连接字符串
在appsettings.json文件中,加入数据库连接字符串:
"ConnectionStrings": {
"DefaultConnection": "Server=127.0.0.1;Database=hello;User Id=sa;Password=clean123;TrustServerCertificate=True;"
},
配置好的文件如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"DefaultConnection": "Server=127.0.0.1;Database=hello;User Id=sa;Password=clean123;TrustServerCertificate=True;"
},
"AllowedHosts": "*"
}
通过EF生成映射
在 NuGet 包管理器命令输入位置输入以下命令
Scaffold-DbContext 'Name=ConnectionStrings:DefaultConnection' Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context MyTestContext -DataAnnotations -UseDatabaseNames -NoPluralize -Project WebApplication1 -Force
上述命令的解释:
- 连接字符串:假设你的数据库连接字符串配置在 appsettings.json 文件的 ConnectionStrings:DefaultConnection 中,因此 Scaffold-DbContext 命令中的 'Name=ConnectionStrings:DefaultConnection' 是正确的。
- 项目名称:根据图片中项目的名称,-Project WebApplication1 这一部分表示生成的代码会与 WebApplication1 项目关联。
- 输出目录:-OutputDir Models 表示生成的实体模型将存放在 Models 目录下,如果没有该目录,会自动创建。
- 上下文名称:-Context MyTestContext 是上下文类的名称,你可以根据需要自定义上下文类名。
- 其他选项:
- -DataAnnotations:使用数据注解而不是 Fluent API。
- -UseDatabaseNames:保持数据库表的原始名称。
- -NoPluralize:禁止生成复数形式的实体名称。
- -Force:强制覆盖已有的模型。
这个步骤操作之后:
项目中会生成两个文件:
他们是数据库表映射的实体类和数据库上下文类文件。 后续操作数据, 就靠这两个类了。
将MyTestContext数据库上下文类,注入到程序中。
// 配置数据库上下文,使用连接字符串
builder.Services.AddDbContext<MyTestContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
将上述的代码写入到 Program.cs 文件中。
整体的 program.cs 文件为:
using Microsoft.EntityFrameworkCore;
using WebApplication1.Models;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// 配置数据库上下文,使用连接字符串
builder.Services.AddDbContext<MyTestContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddControllers();
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
修改项目的 .csproj 文件
双击如图,1的位置。 将2中的两句话写入文件。
<!-- 添加以下两行 -->
<DebugType>pdbonly</DebugType>
<!-- 或者使用 full -->
<WarningLevel>4</WarningLevel>
这个是为了解决启动的时候,提示
- CS1900: "Warning level must be in the range 0-4"
- CS1902: "Invalid option 'portable' for /debug; must be full or pdbonly"
的错误。
编写Controller代码
整体的代码如下:
using Microsoft.AspNetCore.Mvc;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class MyTestController : ControllerBase
{
private readonly MyTestContext _context;
// 通过构造函数注入 MyTestContext
public MyTestController(MyTestContext context)
{
_context = context;
}
public class MyInputModel
{
public int Id { get; set; }
public string Name { get; set; }
}
/// <summary>
/// 测试接口
/// </summary>
/// <returns></returns>
[HttpGet("GetOne")]
public IActionResult GetOne()
{
return Ok("Hello, this is GetOne!");
}
/// <summary>
/// 查询所有数据
/// </summary>
/// <returns></returns>
[HttpGet("GetCleanTableTest")] // 将路径设置为 api/MyTest/clean-table
public IActionResult GetCleanTableTest()
{
// 查询 test 表中的所有数据
var testData = _context.test.ToList();
return Ok(testData); // 返回查询到的数据
}
/// <summary>
/// 根据id查询数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("GetValueById")]
public IActionResult GetValueById([FromBody] int id)
{
// 查询 test 表中的所有数据
var testData = _context.test.Where(t => t.id == id);
return Ok(testData); // 返回查询到的数据
}
/// <summary>
/// 添加数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("MyAdd")]
public IActionResult MyAdd([FromBody] MyInputModel input)
{
int oid = input.Id;
string oname = input.Name;
var oEntity = new test
{
id = oid,
name = oname
};
// 查询 test 表中的所有数据
_context.test.Add(oEntity);
var res = _context.SaveChanges();
return Ok(res); // 返回查询到的数据
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("MyUpdate")]
public IActionResult MyUpdate([FromBody] MyInputModel input)
{
int oid = input.Id;
string oname = input.Name;
var entity = _context.test.FirstOrDefault(t => t.id == oid);
if(entity != null)
{
entity.name = oname;
var res = _context.SaveChanges();
return Ok(res); // 返回查询到的数据
}
else
{
return Ok("未找到对应数据");
}
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("MyDelete")]
public IActionResult MyDelete([FromBody] MyInputModel input)
{
int oid = input.Id;
string oname = input.Name;
var entity = _context.test.FirstOrDefault(t => t.id == oid);
if (entity != null)
{
_context.test.Remove(entity);
var res = _context.SaveChanges();
return Ok(res); // 返回查询到的数据
}
else
{
return Ok("未找到对应数据");
}
}
}
}
我基本上,就是测试了一个简单的单表crud. 对于多表联合查询,可以使用Linq来编写相关代码。 (后续我会再完善一个具体的例子)
测试效果
如图, 要选择 http启动。
项目启动成功, 会自动弹出 swagger 的调用界面.
这个是接口调用测试。 可以看出, 可以从数据库中,查出数据。 你可以自己测试修改,删除, 新增等接口。
你也可以使用 postman 进行接口的调用。
源码下载
WebApplication1.zip
你可以下载这个demo. 在 vs 2022 中打开。 配置好环境即可运行。
写在最后
例子中,使用了 EF 框架。 它对数据库的操作还是比较简洁的。 基本上不用写sql, 它通过中间映射的对象, 对数据库进行操作。
例子提供的是后台的 api 接口。 前端可以使用 主流的 vue, jquery,js,css, html 等技术做页面。 只要调用后台接口就可以了。