【Docker】 .Net Core 3.1 集成EF Code First (MySql) (三)
系列目录:
【Docker】 CentOS7 安装 Docker 及其使用方法 ( 一 )
【Docker】 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二)
【Docker】 .Net Core 3.1 webapi 集成EF Code First (MySql) (三)
.......持续不定期更新中
之前一直用.Net Core 2.1 ,发现3.1后有很多地方和原来的操作不同,踩了一些坑,所以记录一下3.1的操作方法
1.开发环境
.Net Core 3.1
MySql : 5.7.32
2.创建webapi项目
3.查看项目结构,新建ValuesController ,运行项目,打开浏览器访问项目地址 XXX/api/Values
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { [HttpGet] public string Get() { return "value"; } }
4.集成EntityFramework,打开Nuget,安装EntityFramework的包
下载如下包:
Pomelo.EntityFrameworkCore.MySql 此包用于集成EF,进行增删改查等操作
Microsoft.EntityFrameworkCore.Tools 此包是EF工具包,没有不可以使用数据迁移更新数据库
P.S : MySql.Data.XXX 等Mysql官方包不可用 最新版8.0.22 目前不支持.Net Core 3.1,安装后不可用 。
appsetting.json文件添加数据库连接
"ConnectionStrings": { "conn": "Data Source=localhost;Database=test;User ID=root;Password=sima1234;port=3306;sslmode=none;" },
添加数据库DbContext类
public class MyDbContext : DbContext { public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { } public DbSet<User> users { get; set; } }
打开startup.cs,把db对象注入一下,方便Controller层使用,再改造一下Controller,把路径改成自定义。
services.AddScoped<DbContext, MyDbContext>(); //注入一下db对象 services.AddDbContext<MyDbContext>(options => options.UseMySql(Configuration.GetConnectionString("conn")));
5.打开程序包管理控制台,使用Code First创建数据库
add-Migration init \\ init是名字 随便自己取名字 如果有错可以用 Remove-Migration 回退
update-database \\ 上一步成功后更新数据库
生成的Migration迁移文件
打开数据库查看,user成功创建,另外那张表是ef数据迁移版本记录表
6.修改Controller层代码,自定义访问路径
[Route("/[controller]/[action]")] [ApiController] public class ValuesController : ControllerBase { private DbContext _db; public ValuesController(MyDbContext db) { this._db = db; } [HttpGet] public async Task<string> Add() { User user = new User(); user.Username = "admin"; user.Password = "123456"; await _db.Set<User>().AddAsync(user); await _db.SaveChangesAsync(); return "value"; } }
运行结果,注意!访问地址已经为自己定义的了。
7 配置swagger
配置swagger 用于自动生成接口文档,给前端同事查看。
下载此包 Swashbuckle.AspNetCore
将 Swagger 生成器添加到 Startup.ConfigureServices 方法中的服务集合中:
P.S: .Net Core 3.1之后的版本 不用使用 new Info 要用 new OpenApiInfo
// 注册Swagger,定义一个和多个文档 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); });
在 Startup.Configure
方法中,启用中间件为生成 Swagger。
// 启用中间件服务生成Swagger
app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "接口文档"); });
修改接口代码
/// <summary> /// 添加用户 /// </summary> /// <param name="user">用户实体</param> /// <returns></returns> [HttpPost] public async Task<string> Add(User user) { await _db.Set<User>().AddAsync(user); await _db.SaveChangesAsync(); return "value"; } /// <summary> /// 获取所有用户 /// </summary> /// <returns>所有用户</returns> [HttpGet] public async Task<List<User>> GetList() { var list = await _db.Set<User>().ToListAsync(); return list; }
打开网站 访问 XXXX/swagger/inedx.html 访问Swagger文档,接口信息成功显示
8. wagger显示接口注释
右键点击项目-属性-生成,输出xml文档文件,打钩,用于swagger调用显示注释。
修改Startup.cs文件中配置
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "司马的Api", Version = "v1" }); // 获取xml文件名 var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; // 获取xml文件路径 var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径) var xmlPath = Path.Combine(basePath, xmlFile); // 添加控制器层注释,true表示显示控制器注释 c.IncludeXmlComments(xmlPath, true); });
P.S 还有一个坑,记得如果发布选择的是Debug模式,才会有这个xml生成,如果是release模式,就不会生成xml文件。
运行项目,查看,已经有了注释
9. 关闭需要输入注释的警告
项目中有些不想输入注释的地方也会提示要求输入注释!很烦 !
右键点击项目-属性,取消显示警告,添加1591
添加后重新运行项目,问题解决。