在Windows上用VisualStudio2019开发基于MySQL的.NET Core WebAPI项目并发布到银河麒麟高级服务器操作系统V10上

目录

文章目录

前言

一、创建.NET Core 3.1 WebApi项目

二、反向工程,生成EntityFramework相关类

三、添加控制器

四、运行测试

五、发布到银河麒麟高级服务器操作系统V10上

附:

总结



前言

本文将介绍在Windows 10操作系统上,用Visual Studio 2019开发一个基于MySQL数据库的WebApi项目,并发布到银河麒麟高级服务器操作系统V10上的详细过程。


一、创建.NET Core 3.1 WebApi项目

1. 创建项目,选择ASP.NET Core Web应用程序

2. 确认项目名称后,选择创建

3. 选择.NET Core框架,ASP.NET Core 3.1版本,选择API项目类型,点击创建

4. 按下图,打开NuGet管理界面

5. 切换到浏览标签

6. 安装Microsoft.EntityFrameworkCore.Tools 3.1.9

7. 参考上述方法,依次完成安装:

Microsoft.EntityFrameworkCore 3.1.9

MySql.Data.EntityFrameworkCore 8.0.22

 

8. 更新NuGet数据库

按照下图程序包管理打开控制台

输入Update-Database

二、反向工程,生成EntityFramework相关类

1. 本地已准备好MySQL8数据库sbtest,其中表结果及数据如下

DROP TABLE IF EXISTS `sbtest1`;
CREATE TABLE `sbtest1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `k` int NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=1000003 DEFAULT CHARSET=utf8mb4;


LOCK TABLES `sbtest1` WRITE;
INSERT INTO `sbtest1` VALUES (1000001,1,'1','1'),(1000002,2,'2','2');
UNLOCK TABLES;

2. 打开cmd,切换到当前项目目录下。检查dotnet版本信息,参考如下

C:\Users\yidam>cd "C:\Users\yidam\source\repos\WebApplication1\WebApplication1"

C:\Users\yidam\source\repos\WebApplication1\WebApplication1>dotnet --info
.NET SDK (反映任何 global.json):
 Version:   5.0.100
 Commit:    5044b93829

运行时环境:
 OS Name:     Windows
 OS Version:  10.0.14393
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\5.0.100\

Host (useful for support):
  Version: 5.0.0
  Commit:  cf258a14b7

.NET SDKs installed:
  2.1.518 [C:\Program Files\dotnet\sdk]
  3.1.403 [C:\Program Files\dotnet\sdk]
  5.0.100 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.All 2.1.22 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.23 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.22 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.23 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.1.22 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.23 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 3.1.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download

C:\Users\yidam\source\repos\WebApplication1\WebApplication1>

3. 执行反向工程指令

dotnet ef dbcontext scaffold "server=localhost;port=3306;database=sbtest;uid=root;pwd=abcDEF123___;CharSet=utf8mb4" Pomelo.EntityFrameworkCore.Mysql -f -o Models

结果

C:\Users\yidam\source\repos\WebApplication1\WebApplication1>dotnet ef dbcontext scaffold "server=localhost;port=3306;database=sbtest;uid=root;pwd=abcDEF123___;CharSet=utf8mb4" Pomelo.EntityFrameworkCore.Mysql -f -o Models
Build started...
Build succeeded.

此时项目自动生成了一个Models目录,结构如下

其中

Efmigrationshistory.cs

using System;
using System.Collections.Generic;

namespace WebApplication1.Models
{
    public partial class Efmigrationshistory
    {
        public string MigrationId { get; set; }
        public string ProductVersion { get; set; }
    }
}

Sbtest1.cs

using System;
using System.Collections.Generic;

namespace WebApplication1.Models
{
    public partial class Sbtest1
    {
        public int Id { get; set; }
        public int K { get; set; }
        public string C { get; set; }
        public string Pad { get; set; }
    }
}

sbtestContext.cs

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;

namespace WebApplication1.Models
{
    public partial class sbtestContext : DbContext
    {
        public sbtestContext()
        {
        }

        public sbtestContext(DbContextOptions<sbtestContext> options)
            : base(options)
        {
        }

        public virtual DbSet<Efmigrationshistory> Efmigrationshistory { get; set; }
        public virtual DbSet<Sbtest1> Sbtest1 { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
                optionsBuilder.UseMySql("server=localhost;port=3306;database=sbtest;uid=root;pwd=abcDEF123___;charset=utf8mb4", x => x.ServerVersion("8.0.22-mysql"));
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Efmigrationshistory>(entity =>
            {
                entity.HasKey(e => e.MigrationId)
                    .HasName("PRIMARY");

                entity.ToTable("__efmigrationshistory");

                entity.Property(e => e.MigrationId)
                    .HasColumnType("varchar(150)")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_bin");

                entity.Property(e => e.ProductVersion)
                    .IsRequired()
                    .HasColumnType("varchar(32)")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_bin");
            });

            modelBuilder.Entity<Sbtest1>(entity =>
            {
                entity.ToTable("sbtest1");

                entity.HasIndex(e => e.K)
                    .HasName("k_1");

                entity.Property(e => e.Id).HasColumnName("id");

                entity.Property(e => e.C)
                    .IsRequired()
                    .HasColumnName("c")
                    .HasColumnType("char(120)")
                    .HasDefaultValueSql("''")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");

                entity.Property(e => e.K).HasColumnName("k");

                entity.Property(e => e.Pad)
                    .IsRequired()
                    .HasColumnName("pad")
                    .HasColumnType("char(60)")
                    .HasDefaultValueSql("''")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");
            });

            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
}

三、添加控制器

1. 右键Controllers目录,添加一个控制器

2. 选择“MVC 控制器 - 空”

选择“API 控制器 - 空”

3. 编辑ValuesController.cs内容如下

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {

        private readonly sbtestContext context = new sbtestContext();

        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<Sbtest1>> Get()
        {
            return context.Sbtest1.ToList();
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public ActionResult<Sbtest1> Get(int id)
        {
            var item = context.Sbtest1.Where(c => c.Id == id).SingleOrDefault();            
            return item;
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody] Sbtest1 value)
        {
            context.Sbtest1.Add(value);
        }

        // PUT api/values/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] Sbtest1 value)
        {
            if (value.Id != id)
            {
                throw new Exception("id not equeal");
            }
            context.Sbtest1.Update(value);
            context.SaveChanges();
        }

        // DELETE api/values/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
            var item = context.Sbtest1.FirstOrDefault(c => c.Id == id);
            context.Sbtest1.Remove(item);
            context.SaveChanges();
        }
    }

}

四、运行测试

1. VS启动项目

2. 访问/api/values/

五、发布到银河麒麟高级服务器操作系统V10上

1. VS2019发布项目

得到发布输出

已启动生成…
1>------ 已启动生成: 项目: WebApplication1, 配置: Release Any CPU ------
1>C:\Users\yidam\source\repos\WebApplication1\WebApplication1\Models\sbtestContext.cs(25,10,25,214): warning CS1030: #警告:“To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.”
1>WebApplication1 -> C:\Users\yidam\source\repos\WebApplication1\WebApplication1\bin\Release\netcoreapp3.1\WebApplication1.dll
1>已完成生成项目“WebApplication1.csproj”的操作。
2>------ 发布已启动: 项目: WebApplication1, 配置: Release Any CPU ------
正在连接到 C:\Users\yidam\source\repos\WebApplication1\WebApplication1\bin\Release\netcoreapp3.1\publish\...
WebApplication1 -> C:\Users\yidam\source\repos\WebApplication1\WebApplication1\bin\Release\netcoreapp3.1\WebApplication1.dll
WebApplication1 -> C:\Users\yidam\source\repos\WebApplication1\WebApplication1\obj\Release\netcoreapp3.1\PubTmp\Out\
Web 应用已成功发布 file:///C:/Users/yidam/source/repos/WebApplication1/WebApplication1/bin/Release/netcoreapp3.1/publish/

========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
========== 发布: 成功 1 个,失败 0 个,跳过 0 个 ==========

2. 通过FileZilla将publish目录上传到服务器/root/下

3. ssh登陆服务器,进入/root/publish目录,启动web服务

[root@localhost ~]# cd /root/publish/
[root@localhost publish]# dotnet WebApplication1.dll
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /root/publish

4. 在服务器本地用curl检测接口

[root@localhost ~]# curl https://localhost:5001/api/values -k
[{"id":1000001,"k":1,"c":"1","pad":"1"},{"id":1000002,"k":2,"c":"2","pad":"2"}]

附:

服务器系统信息

[root@localhost ~]# cat /etc/kylin-release 
Kylin Linux Advanced Server release V10 (Azalea)
[root@localhost ~]# dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   3.1.402
 Commit:    9b5de826fd

Runtime Environment:
 OS Name:     kylin
 OS Version:  V10
 OS Platform: Linux
 RID:         linux-arm64
 Base Path:   /root/dotnet/sdk/3.1.402/

Host (useful for support):
  Version: 3.1.8
  Commit:  9c1330dedd

.NET Core SDKs installed:
  3.1.402 [/root/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.1.8 [/root/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.8 [/root/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

总结

采用.NET Core 框架,可以轻松完成ASP.NET C# Web项目迁移到国产银河麒麟高级服务器操作系统V10上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值