《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后端项目

  1. 后端项目搭建与Swagger配置步骤
  2. 配置CROS策略解决跨域问题
  3. AutoMapper & Restful API & DI
  4. (本文)EF Core & Postgresql
  5. (暂未发表敬请期待...).Net Core 3升级成 .Net Core 5
  6. (暂未发表敬请期待...)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路径设置成与你的电脑路径匹配!

https://github.com/Impartsoft/Simple_Asp.Net_Core/tree/master/Simple_Asp.Net_Core 4.EF Core %26 Postgresql

参考资料

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

posted @ 2021-03-02 23:22  Iannnnnnnnnnnnn  阅读(1143)  评论(1编辑  收藏  举报