Net Core 6.0 webApi+sqlServer数据库教程实战
教程前言
本教程从构建项目开始到实战采用的是vsCode开发工具,初学者建议使用vs Studio进行创建,因为这样建的东西比较全一点。
安装net core 环境
1.我们首先要下载net core sdk ,这样我们才能使用dotnet终端命令和运行项目,官方下载链接:net core sdk 下载,我下载的版本是6.0。 下载安装完成之后打开cmd窗口验证是否安装成功:
dotnet --version
效果如图: 查看dotnet其它命令
dotnet --help
2.安装c#运行环境 在vscode插件中搜索c#,并进行安装。
构建wepApi项目
在vsCode中我们使用终端命令快速构建webApi项目:
dotnet new webapi -o TodoApi
cd TodoApi
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.InMemory
code -r ../TodoApi
执行完后目录结构,有一些是我后面添加的
program.cs :服务注册类文件,像数据库服务注册,拦截器注册等都在里面; appsettings.json :配置类文件,通常放置一些可配置的信息,这样就不用去改代码,像数据库连接字符串,访问接口地址等;
我们就可以使用dotnet命令运行项目了
dotnet run
运行之后在本地就可以在浏览器访问项目默认的接口https://localhost:5001/WeatherForecast tip:这里默认访问形式是控制器的get方法,如果我们想访问 控制器/方法名,需要在控制器页面修改访问路由,这样就可以了。
操作数据库
- 创建Models文件夹,创建model类文件
- 类型后面加?代表可以为null
- 标注属性key,代表是主键,表中无主键需标注keyless
- 创建模型操作上下文类
using Microsoft.EntityFrameworkCore;
using System.Diagnostics.CodeAnalysis;
namespace TodoApi.Models
{
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options)
: base(options)
{
}
public DbSet<personApplyInfo> personApplyInfo { get; set; } = null!;
public DbSet<phoneInfo> phoneInfo { get; set; } = null!;
}
}
- 注册数据库服务
- 编写操作数据库接口(可以使用帮助类或者ef)
一、帮助类方式
using System.Data;
using System.Data.SqlClient;
public class SqlHelper
{
public static string? Constr { get; set; }
public static DataTable ExecuteTable(string cmdText) {
using (SqlConnection con = new SqlConnection(Constr))
{
con.Open();
SqlCommand cmd = new SqlCommand(cmdText, con);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
return ds.Tables[0];
}
}
}
二、EF 初始化操作对象 查询操作方法 新增操作方法 ef的写法大家可以百度,这里不做详解。 5.
接口调用
net core可以使用模型验证参数,我们创建验证模型类目录和文件 其中可以通过标注属性的方式进行验证,如果我们不需要的话可以进行在program.cs关闭。
builder.Services.Configure<ApiBehaviorOptions>((o) =>
{
o.SuppressModelStateInvalidFilter = true;
});
- Get
我们访问就跟平时一样调用,url?parm="" - Post
需要注意参数是放在formbody中,且需要配置content-type:application/json;charset=UTF-8
相关快速扩展
- 转换类
使用的是Newtonsoft.Json包,没有请安装
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace Opertion
{
public class Opertion : ControllerBase
{
public static List<Dictionary<string, object>> DataTableToList(DataTable dt)
{
List<Dictionary<string, object>> list
= new List<Dictionary<string, object>>();
foreach (DataRow dr in dt.Rows)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
foreach (DataColumn dc in dt.Columns)
{
dic.Add(dc.ColumnName, dr[dc.ColumnName]);
}
list.Add(dic);
}
return list;
}
public static Dictionary<string, List<Dictionary<string, object>>> DataSetToDic(DataSet ds)
{
Dictionary<string, List<Dictionary<string, object>>> result = new Dictionary<string, List<Dictionary<string, object>>>();
foreach (DataTable dt in ds.Tables)
result.Add(dt.TableName, DataTableToList(dt));
return result;
}
public static string FormatDateToJson<T>(T obj)
{
IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm";
return JsonConvert.SerializeObject(obj, Formatting.Indented, timeFormat);
}
public static OkObjectResult ReturnDatToJson(Enum code, string msg, object data)
{
return new OkObjectResult(new
{
code = code,
msg = msg,
data = data
});
}
}
}
- 使用枚举类
using System;
using System.Reflection;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
public enum errorEunm
{
[Display(Name = "1小时内,连续超过5次申请验证,请于24小时后再申请")]
waitLoing = 101,
[Display(Name = "请填写手机号")]
phoneReq = 102,
[Display(Name = "请填写正确的手机号格式")]
phoneFmort = 103,
[Display(Name = "操作成功")]
success = 200,
[Display(Name = "操作失败")]
Error = 400,
[Display(Name = "请发送手机验证码")]
phoneCode = 103,
[Display(Name = "验证码不一致")]
codeDiff = 104,
[Display(Name = "请填写申请名称")]
applyName = 105
}
public static class EumHelper
{
public static string GetDisplayName(this Enum eum)
{
var type = eum.GetType();
var field = type.GetField(eum.ToString());
var obj = (DisplayAttribute)field.GetCustomAttribute(typeof(DisplayAttribute));
return obj.Name ?? "";
}
}
- 拦截器
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
public class MyExpextFilter : ExceptionFilterAttribute
{
private ILogger<MyExpextFilter> logger;
public MyExpextFilter(ILogger<MyExpextFilter> logger)
{
this.logger = logger;
}
public override void OnException(ExceptionContext context)
{
if (!context.ExceptionHandled)
{
if (this.IsAjax(context.HttpContext.Request))
{
context.Result = new OkObjectResult( new
{
Message = context.Exception.Message,
ReturnCode = context.HttpContext.Response.StatusCode,
Data = new List<object>()
});
}
logger.LogError(context.Exception.Message);
context.ExceptionHandled = true;
}
}
public override Task OnExceptionAsync(ExceptionContext context)
{
this.OnException(context);
return Task.CompletedTask;
}
private bool IsAjax(HttpRequest httpRequest)
{
string requestType = httpRequest.Headers["x-requested-with"];
return "XMLHttpRequest".Equals(requestType, StringComparison.Ordinal);
}
}
总结
最近才开始学习netcore,此文章只是作为入门参考,还有很多东西还要继续学习,后面会发关于部署的相关文章,发现更好的也会进行更新。
|