《Asp.Net Core3 + Vue3入坑教程》 - 4.EF Core & Postgresql
简介
《Asp.Net Core3 + Vue3入坑教程》 此教程适合新手入门或者前后端分离尝试者。可以根据图文一步一步进操作编码也可以选择直接查看源码。每一篇文章都有对应的源码
教程后期会将 .Net Core 3升级成 .Net Core 5
目录
《Asp.Net Core3 + Vue3入坑教程》系列教程目录
Asp.Net Core后端项目
- 后端项目搭建与Swagger配置步骤
- 配置CROS策略解决跨域问题
- AutoMapper & Restful API & DI
- (本文)EF Core & Postgresql
- (暂未发表敬请期待...).Net Core 3升级成 .Net Core 5
- (暂未发表敬请期待...)JWT
Vue3 前端项目
暂未发表敬请期待...
本文简介
本文为《Asp.Net Core3 + Vue3入坑教程》系列教程的后端第四篇 - EF Core & Postgresql。上文已经为Simple项目增加了Restful API 但是数据是模拟出来的,本文继续为Simple项目增加与Postgresql数据库的连接,并使用EF Core ORM框架实现与数据库的交互。
EF Core & Postgresql
安装postgresql数据库
直接进官网下载 https://www.postgresql.org/
安装完成后,找到安装目录启动psql.exe
安装 navicat
也可以不安装navicat,使用其他数据库客户端
官网下载 http://www.navicat.com.cn/
运行navicat 链接 postgresql 数据库
连接配置如下,密码123456
准备工作就绪,这时候回到项目中
安装Microsoft.EntityFrameworkCore Nuget包
安装Microsoft.EntityFrameworkCore.Design Nuget包
安装Npgsql.EntityFrameworkCore.PostgreSQL Nuget包
增加Postgresql链接配置,调整Startup.cs
代码如下:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json.Serialization;
using Simple_Asp.Net_Core.Data;
using Simple_Asp.Net_Core.ServiceProvider;
using System;
namespace Simple_Asp.Net_Core
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<CommanderContext>(options =>
options.UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=123456"));
services.AddCORS();
services.AddMvc();
services.AddSwagger();
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
services.AddScoped<ICommanderRepo, MockCommanderRepo>();
services.AddControllers().AddNewtonsoftJson(s =>
{
s.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "ApiHelp V1");
});
}
app.UseCors("CorsTest");
app.UseRouting();
app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());
}
}
}
在Data文件夹下新建类CommanderContext.cs
使用 EF Core 时,数据访问是通过使用模型来执行的。 模型由(域模型)实体类和表示与数据库的会话的派生上下文 (DbContext) 组成。更多内容参考 https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.entityframeworkcore.dbcontext?view=efcore-5.0
代码如下
using Microsoft.EntityFrameworkCore;
using Simple_Asp.Net_Core.Models;
namespace Simple_Asp.Net_Core.Data
{
public class CommanderContext : DbContext
{
public CommanderContext(DbContextOptions<CommanderContext> opt) : base(opt)
{
}
public DbSet<Command> Commands { get; set; }
}
}
实现 ICommanderRepo 仓储层接口,在Data文件夹下新建类 SqlCommanderRepo.cs
using Simple_Asp.Net_Core.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Simple_Asp.Net_Core.Data
{
public class SqlCommanderRepo : ICommanderRepo
{
private readonly CommanderContext _context;
public SqlCommanderRepo(CommanderContext context)
{
_context = context;
}
public void CreateCommand(Command cmd)
{
if (cmd == null)
{
throw new ArgumentNullException(nameof(cmd));
}
_context.Commands.Add(cmd);
}
public void DeleteCommand(Command cmd)
{
if (cmd == null)
{
throw new ArgumentNullException(nameof(cmd));
}
_context.Commands.Remove(cmd);
}
public IEnumerable<Command> GetAllCommands()
{
return _context.Commands.ToList();
}
public Command GetCommandById(int id)
{
return _context.Commands.FirstOrDefault(p => p.Id == id);
}
public bool SaveChanges()
{
return (_context.SaveChanges() >= 0);
}
public void UpdateCommand(Command cmd)
{
//Nothing
}
}
}
再次调整 Startup.cs ,将ICommanderRepo 接口实现替换成SqlCommanderRepo
services.AddScoped<ICommanderRepo, MockCommanderRepo>();
=>
services.AddScoped<ICommanderRepo, SqlCommanderRepo>();
使用swagger进行调试,调用/api/Commands接口
因为数据库中缺少Commands表,所以后端报错了,接下来我们使用EF自动创建Commands表
打开开发者命令提示窗口
接下来会使用到 .Net Core CLI命令,具体可以参考 https://docs.microsoft.com/zh-cn/dotnet/core/tools/
将EF注册成全局工具
命令如下:
dotnet tool install --global dotnet-ef
执行迁移初始化命令
命令如下:
dotnet ef migrations add InitialMigration
发现报错了
因为当前文件夹找不到解决方案,所以报错了
进入Simple_Asp.Net_Core文件夹再次执行迁移初始化命令
命令如下:
cd Simple_Asp.Net_Core
dotnet ef migrations add InitialMigration
执行成功
在项目中可以看到生成了Migrations文件夹
接下来使用EF将表的变化更新到Postgresql数据库上
cd Simple_Asp.Net_Core
dotnet ef database update
打开navicat,可以发现增加了两张表,一张是EF迁移历史表,另一张就是Commands表
现在本章针对Simple项目的代码编写与EF配置工作已经完成!
现在我们可以使用swagger进行接口测试,并查看数据是否有正确保存与返回
总结
本文为Simple项目增加与Postgresql数据库的连接,这里数据库可以替换成其他数据库,只需引入正确Nuget包,以及调整数据库连接配置即可!本文应用的是EF Core里的Code First方式进行开发,EF Core的内容很多本文只有简单的使用,更多知识可以参考 https://docs.microsoft.com/en-us/ef/core/ 文档进行深入学习!
GitHub源码
注意:源码调试过程中如果出现xml文件路径错误,需要参照第一章(后端项目搭建与Swagger配置步骤)Swagger配置“配置XML 文档文件”步骤,取消勾选然后再选中 ,将XML路径设置成与你的电脑路径匹配!
参考资料
EF Core官网文档(推荐学习) https://docs.microsoft.com/en-us/ef/core/
.Net Core CLI命令 https://docs.microsoft.com/zh-cn/dotnet/core/tools/
微软官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/?view=aspnetcore-5.0
作者:Iannnnnnnnnnnnn
出处:https://www.cnblogs.com/Iannnnnnnnnnnnn
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。