EFCore 的使用和配置
- 本人以前做前端开发的,就是
html
,js
,css
,vue
,react
那些 - 此前没接触过
.net
甚至没接触过C#
, 若哪里不对或有缺陷欢迎指出,以便改正! ^_^ - 这是当前所在公司的一个小项目 , 虽然这个项目不大, 但是奈何我又喜欢新版本,所以直接用的
.net core 6.0
- 而且多数问题百度, 谷歌 都只有
.net 3.x
版本的回答 - 本项目的前端是用的
Blazor
- 俗话说: 好记性不如烂笔头 , 自己做个笔记 , 能帮到其他朋友更好!
使用VS2022 新建webapi项目(不做赘述)
本项目地址
配置数据库
- 添加包:
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Design
- Microsoft.EntityFrameworkCore.Tools
- Pomelo.EntityFrameworkCore.MySql(Microsoft.EntityFrameworkCore.Mysql不支持最新版dot net)
- 在
appsettings.json
中 添加配置代码: 例
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "server=localhost;database=wcsb_black_list;user id=root;password=toor"
}
}
- 依赖注入:
// 连接数据库
builder.Services.AddDbContext<BlackListContext>(options =>
options.UseMySql(builder.Configuration.GetConnectionString("DefaultConnection"),ServerVersion.Parse("8.0.26")));
// 可访问和使用静态文件
app.UseStaticFiles();
- 创建Models文件夹并创建数据Model
namespace WCSB_Black_LIst_API.Models
{
public class BlackList
{
[Key] public int Id { set; get; }
[DisplayName("姓名")] public string Name { set; get ; }
[DisplayName("身份证号")] public string IdCard { set; get ; }
[DisplayName("户籍地")] public string? Address { set; get ; }
}
}
- 创建数据上下文
using Microsoft.EntityFrameworkCore;
namespace WCSB_Black_LIst_API.Models
{
public class BlackListContext:DbContext
{
public BlackListContext(DbContextOptions<BlackListContext> options) : base(options)
{
}
public DbSet<BlackList> BlackList { get; set; }
// 如果多个Model 例:
public DbSet<Other> Others { get; set; }
}
}
- 使用EFCore 的数据迁移(根据之前创建的Model和Context自动创建数据库)
- 在程序包管理控制台(左下角, 或者
工具
->NuGet包管理器
->程序包管理控制台
) 输入get-help entityframework
查看帮助 - 常用的命令:
add-migration 名
添加一个新的迁移 -
script-migration
生成迁移脚本 -
update-database
更新数据库 - 至此 准备工作和表就建好了
数据的操作
- 在Controller文件夹中创建相应的控制器
- 如: BlackListController.cs
- 控制器继承于
ControllerBase
类
[ApiController] 启用固定行为,使生成 Web API 更加容易。 一些行为包括参数源推理、将属性路由作为一项要求以及模型验证错误处理增强功能。
[Route] 定义路由模式 [controller]。 [controller] 令牌将替换为控制器的名称(不区分大小写,无 Controller 后缀)。文章来源:https://www.toymoban.com/news/detail-444663.html
using Microsoft.AspNetCore.Mvc;
using WCSB_Black_LIst_API.Models;
namespace WCSB_Black_LIst_API.Controllers
{
// [Route("api/[controller]")]
[Produces("application/json")]
[Consumes("application/json", "multipart/form-data")]//此处为新增 接受form表单数据
[Route("api/")]
[ApiController]
public class BlackListController : ControllerBase
{
private readonly BlackListContext context;
public BlackListController(BlackListContext context)
{
this.context = context;
}
}
}
增
var data = new BlackList() { IdCard = idCard, Name = name, Address = address };
context.BlackList.Add(data); // 添加操作
context.SaveChanges(); // 保存更改
删
var data = context.BlackList.Where(_ => _.Id == id).FirstOrDefault(); // 通过条件筛选并选取第一个数据
context.BlackList.Remove(data); // 删除操作
context.SaveChanges(); // 保存更改
改
var data = context.BlackList.Where(_ => _.Id == id).FirstOrDefault(); // 通过条件筛选选取第一个数据
data.Name = name; // 修改name值
data.Address = address; // 修改address值
data.IdCard = idCard; // 修改idCard值
context.SaveChanges(); // 保存更改
查
- 模糊查询
// 模糊查询
// str.Contains(keyword) 检查str中是否包含keyword字符串
var s = context.BlackList.Where(_ => _.Name.Contains(keyword) || _.IdCard.Contains(keyword) || _.Address.Contains(keyword));
// 获取总数据量
var total = s.Select(_ => _.Id).Distinct().Count();
// 分页
// Skip(从第多少条数据开始/忽略之前多少条数据)
// Task(从开始处查询多少条数据)
var res = s.Skip(limit * (page-1)).Take(limit);
- 获取全部数据
var bl = context.BlackList;
// 查数量
var total = bl.Select(_ => _.Id).Distinct().Count();
// 获取全部数据
// bl.ToListAsync();
// 分页查询
var res = bl.Skip(limit * (page-1)).Take(limit);
增删改查的完整示例(只示例两个典型,其他类似)
// 搜索
[HttpGet("Search")]
public async Task<object> Search(string keyword,int page = 1, int limit = 20)
{
try
{
var s = context.BlackList.Where(_ => _.Name.Contains(keyword) || _.IdCard.Contains(keyword) || _.Address.Contains(keyword));
var total = s.Select(_ => _.Id).Distinct().Count();
var res = s.Skip(limit * (page-1)).Take(limit);
return new {code = 200 , data =new {
list = res,
total
}, message="查询成功"};
}
catch (Exception e)
{
return new {code = 400,message=e.Message};
}
}
// 更新/添加 (取决于有没有id) 参数为对象的方式在前端为JSON传参方式(content-type:application/json)
[HttpPost("UpdatePeople")]
public async Task<object> UpdatePeople(BlackList blackList )
{
try
{
int id = blackList.Id;
string name = blackList.Name;
string? address = blackList.Address;
string idCard = blackList.IdCard;
if (id == 0)
{
var data = new BlackList() { IdCard = idCard, Name = name, Address = address };
context.BlackList.Add(data);
}
else
{
var data = context.BlackList.Where(_ => _.Id == id).FirstOrDefault();
data.Name = name;
data.Address = address;
data.IdCard = idCard;
}
context.SaveChanges();
return new { code = 200, message = (id == 0 ? "新增" : "修改") + "成功" };
}
catch (Exception e)
{
return new { code = 500, message = e.Message };
}
}
Excel导入数据的操作
- 这里使用的是
Npoi.Mapper
库 在NuGet中可找到安装 - Excel示例:
姓名 | 证件号码 | 户籍地 |
---|---|---|
张三 | 513002221152151201 | 四川省达州市大竹县 |
李四 | 51300222115215120X | 四川省达州市通川区 |
王五 | 513002221152154561 | 四川省达州市达川区 |
- 以下是代码
// excel的结构
private class BlackListExcel {
public string? Name { set; get; }
public string? IdCard { set; get; }
public string? Address { set; get; }
}
[HttpPost("UploadExcel")]
public async Task<object> UploadExcel(IFormCollection files)
{
try {
// 遍历文件的数量
foreach (var file in files.Files)
{
// 文件名
string fileName = file.FileName;
// 获取文件的后缀名
string[] suffixArr = fileName.Split(".");
string suffix = suffixArr[suffixArr.Length-1];
// 限制后缀名
if(suffix != "xlsx" && suffix != "xls" && suffix != "xlsm"&& suffix != "xltx"&& suffix != "et"&& suffix != "ett")
{
throw new Exception($"[Error]文件格式不正确: .{suffix}不是有效的Excel文件格式!");
}
// 根据文件的数据流创建mapper对象
var mapper = new Mapper(file.OpenReadStream());
// 根据excel的标题映射数据
var map = mapper.Map<BlackListExcel>("姓名", o => o.Name).Map<BlackListExcel>("证件号码", o => o.IdCard).Map<BlackListExcel>("户籍地", o => o.Address);
// 获取映射后的数据列表
var data = map.Take<BlackListExcel>("sheet1").Select(_ => _.Value);
// 遍历数据列表
foreach (var item in data)
{
// 创建新的数据
var black = new BlackList() {IdCard = item.IdCard, Name = item.Name, Address = item.Address };
// 添加到临时blacklist上下文中 , 不要每一条都保存更改, 不止耗时还耗费资源
context.BlackList.Add(black);
}
// 最后保存更改
context.SaveChanges();
}
return new { code = 200, message = "导入成功" };
}catch(Exception e)
{
return new { code = 500, message = e.Message };
}
}
Cors跨域
[官方文档] 在 ASP.NET CORE 中 (CORS) 跨 ASP.NET Core文章来源地址https://www.toymoban.com/news/detail-444663.html
- 注入Cors服务
builder.Services.AddCors(options =>
{
// 所有人都能跨域访问
options.AddPolicy(name:"getData", builder =>
{
builder.AllowAnyMethod().AllowAnyHeader().SetIsOriginAllowed(_=>true);
});
// 指定域名可跨域访问
options.AddPolicy(name:"Policy", builder =>
{
builder.AllowAnyMethod().AllowAnyHeader().WithOrigins("http://example.com",
"http://www.contoso.com");
});
});
// 使用 必须在app.app.UseRouting();之后 且在app.UseAuthorization();之前;
app.UseCors();
// 或者全局使用
app.UseCors("Policy");
- 用法 我这里在controller中使用
[HttpGet("Search"), EnableCors("getData")]
public async Task<object> Search(string name , string idCard)
{
try
{
var data = context.BlackList.Where(_ => _.IdCard == idCard && _.Name == name).FirstOrDefault();
return new { code = 200, data, message = "查询成功" };
}
catch (Exception e)
{
return new { code = 500, message = e.Message };
}
}
到了这里,关于.net core 6.0 web api 爬坑日记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!