專題目錄
國産化之路-統信UOS作業系統安裝
國産化之路-國産作業系統安裝.net core 3.1 sdk
國産化之路-安裝WEB伺服器
國産化之路-安裝達夢DM8資料庫
國産化之路-統信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 達夢DM8實作簡單增删改查操作
引言
經過前期的準備工作,.net core 3.1的運作環境和WEB伺服器已經搭建完畢,這裡需要注意一下,達夢DM8資料庫對于Entity Framework Core 3.1 的驅動在NuGet官方源上并沒有正式釋出,需要從Win64安裝版本中的
drivers/dotNet
提取,這裡需要事先準備。
建立項目
出于開發的習慣和便利性,項目的開發和調試都還是在windows的環境下面進行,打開Visual Studio 2019,建立新項目,使用
ASP.NET Core web應用程式
模闆,項目名稱自己取一下,我這裡取名
DmExample
,版本選擇
ASP.NET Core 3.1
,
為HTTPS 配置
勾選去掉,暫時不需要HTTPS
點選”建立“按鈕後,稍微等待一會兒,預設的MVC項目搭建完成。在
Controllers
目錄下隻有一個
HomeController.cs
檔案,點選運作看一下:
已經可以正常跑起來,接下來我們要在這個基礎下開始添加模型、連接配接達夢資料庫、建立資料庫、添加簡單的增删改查的操作。
添加驅動
在添加應用之前,為了能夠連接配接資料庫和建立表,我們首先要使用NuGet包管理工具,安裝如下支援包:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.Design
安裝完以上包後,我們需要安裝EF Core的達夢資料庫驅動,前面提到過在官方的NuGet源中并沒有達夢的EF Core驅動,但在達夢的安裝盤上有提供,是以需要對NuGet包管理器的程式包源進行添加設定,将達夢資料庫安裝源中的
EFCore.Dm3.1
,
DmProvider
作為包源引入,然後再安裝。
在NuGet包管理器中,點選右上角(紅框框起來的齒輪圖示),彈出選項視窗:
點選視窗右上角的加号圖示,然後名稱輸入
EFCore.Dm3.1
,源路徑選擇你CD光牒鏡像下面的
source\drivers\dotNet\EFCore.Dm3.1
。以同樣的方式将
DmProvider
包源引入,源路徑:
source\drivers\dotNet\DmProvider
,包源設定完成後就可以安裝。
如上圖所示,選擇程式包源
EFCore.Dm3.1
後,在浏覽面闆中會列出達夢的EntityFramework Core的驅動包,選擇它然後點選”安裝“。
同樣,選擇程式包源
DmProvider
後,在浏覽面闆中會列出達夢的DmProvider的驅動包,選擇它然後點選”安裝“。這裡有個地方需要注意,在NuGet包源上可以搜尋到
DmProvider 2.0
版本的包,雖然版本高于我們目前的本地版本,但這個是
.NetFramework
版本的,于2017年9月7日釋出,不适用于Core版本的,請不要安裝或更新。
添加模型
驅動安裝完成後,我們要添加一個資料模型,在
Models
目錄下添加一個
User.cs
使用者模型,具體代碼如下:
using System;
using System.ComponentModel.DataAnnotations;
namespace DmExample.Models
{
/// <summary>
/// 使用者模型
/// </summary>
public class User
{
public User()
{
Id = Guid.NewGuid().ToString("N");
CreateTime = DateTime.Now;
}
[Key]
public string Id { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年齡
/// </summary>
public int? Age { get; set; }
/// <summary>
/// 性别
/// </summary>
public bool? Gender { get; set; }
/// <summary>
/// 建立日期
/// </summary>
public DateTime? CreateTime { get; set; }
}
}
屬性不多,就ID、姓名、年齡、性别、建立日期,分别使用了字元串、整型、布爾型和日期類型,對一些正常性的屬性做一下資料表屬性對應測試。
建立資料庫
添加資料庫上下文
在項目中添加
DbContext
目錄,在目錄中添加一個名為
DmContext.cs
的類作為達夢資料庫上下文,具體代碼如下:
using DmExample.Models;
using Microsoft.EntityFrameworkCore;
namespace DmExample.DbContext
{
/// <summary>
/// 達夢資料庫上下文
/// </summary>
public class DmContext : Microsoft.EntityFrameworkCore.DbContext
{
/// <summary>
/// 使用者
/// </summary>
public DbSet<User> Users { get; set; }
public DmContext(DbContextOptions<DmContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().ToTable("sys_user");
}
}
}
如上代碼所示,
DmContext
繼承自
Microsoft.EntityFrameworkCore.DbContext
,添加了使用者
User
的
DbSet
,重載
OnModelCreating
方法,将
User
模型與資料庫的
sys_user
表建立映射關系,當然也可以不指定映射關系,在不指定的情況下,預設映射成
Users
資料表。目前我們還沒建立資料庫,資料庫裡也還沒有這個資料表,接下來需要配置資料庫連接配接。
配置資料庫連接配接
(1)添加資料庫連接配接字元串
打開項目中的
appsettings.json
配置檔案,添加資料庫連接配接字元串,如下所示:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DmExample": "Server=localhost;Database=DmExampleDB;User=SYSDBA;Password=111111;"
}
}
我們在
appsettings.json
配置檔案中添加了一個
ConnectionStrings
的配置項,用來設定資料庫連接配接字元串,連接配接字元串命名為
DmExample
,字元串的格式同我們連接配接SqlServer類似,
Server
為資料庫位址、
Database
為資料庫名稱、
User
和
Password
分别為連接配接資料庫賬号和密碼,需要注意的一點是設定資料庫位址的時候如果是本地位址,咱們往往習慣性地用
Server=.
來表示,但是達夢資料庫不認識這種表示,會無法連接配接資料庫,需要把點替換成
localhost
或
127.0.0.1
才行,這個注意一下。
(2)注冊資料庫上下文
完成資料庫連接配接字元串的添加後,我們需要在
Starup.cs
類中對目前的資料庫上下文進行注冊,微軟已經為我們提供上下文注冊的中間件,隻要調用它就可以了,具體代碼如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// 注冊DbContext
services.AddDbContext<DmContext>(options =>
options.UseDm(Configuration.GetConnectionString("DmExample")));
}
如上代碼所示,
DmContext
是咱們建立的達夢資料庫上下文,
DmExample
是我們在
appsettings.json
配置檔案中添加的資料庫連接配接字元串,通過
Configuration.GetConnectionString
方法擷取該資料庫連接配接字元串。這裡注意這個代碼:
options.UseDm
,我們連接配接
SqlServer
資料庫的時候是使用
options.UseSqlServer
,如果我們以後連接配接
MySql
資料庫時是使用
options.UseMySQL
,使用不同的資料庫需要對應的資料庫驅動,
UseDm
就是由達夢資料庫驅動提供的方法,至此資料庫的連接配接我們已配置完成,接下來我們要建立資料庫。
建立資料庫
資料庫連接配接配置完成後,我們直接使用Visual Studio 2019的程式包管理器控制台,通過指令方式來建立資料庫,首先輸入如下指令(initDB是我們取的名字,沒有強制規定):
add-migration 'initDB'
The add-migration command is one of the key commands in code first migrations. When you make changes to your domain model and need them dded into your database you create a new migration. This is done with the Add-Migration command. In it’s simplest form you need only toprovide a migration name.
add-migration指令是code first migration中的關鍵指令之一。當您對領域域模型進行更改并需要将它們時添加到資料庫中,您将建立一個新的遷移。這是通過Add-Migration指令完成的。用最簡單的形式,你隻需要提供遷移名稱。
指令執行成功後會在目前的項目中建立
Migrations
目錄, 在這個目錄中我們發現有兩個檔案,其中一個檔案由目前建立日期加上我們之前add 後面建立名字的一個記錄
20201002080053_initDB
記錄了此次更新的部分,由于我們是第一次初始化,是以裡面記錄了全部表結構内容,下次我們再次使用該指令做更新時,會再次添加新的記錄檔案,隻記錄更新部分;另一個名為
DmContextModelSnapshot
的檔案是 Migrations生成的IModel狀态的快照的基類,裡面記錄了要生成db的内容。
接下來執行更新資料庫指令:
update-database
出現如上圖所示表示執行成功,為驗證是否建立資料表,我們打開達夢的資料庫管理工具,檢視資料庫是否已存在:
我們在
模式->SYSDBA->表
下面發現了
sys_user
這張表,在
表空間->MAIN->表
也能夠看到這張表。資料表應該是建立成功了,但是就是沒有發現我們在資料庫連接配接字元串中指定的資料庫名
DmExampleDB
,估計是達夢的資料庫結構和SqlServer有所差別,這個放在後面系統性地再去學習了,至此我們資料庫建立完畢,接下來開始添加針對使用者的CURD操作了。
添加增删改查操作
我們選中項目中的
Controllers
目錄,點選右鍵彈出下拉菜單依次點選
添加->控制器
,彈出添加已搭建基架的新項視窗,選擇”視圖使用Entity Framework的MVC控制器“,然後點選”确定“按鈕,如下圖所示:
點選”确定“按鈕後彈出添加視圖的配置視窗,模型類選擇
User
,資料上下文類選擇
DmContext
,控制器名稱預設
UsersController
,然後點選"添加"按鈕。
稍微等待片刻後,我們看到在
Controllers
目錄中已經生成了
UsersController
類,打開這個類檔案,增删改查的代碼都已經生成;點開
Views
視圖目錄,下面新增了
Users
目錄,在該目錄裡邊增删改查的視圖也已全部生成。
使用者操作的功能基本都有了,我們稍作改造就可以使用了。首先,我們要在首頁上添加使用者的
User
的入口菜單,以便對使用者進行操作,打開
Views/Shared/_Layout.cshtml
,添加如下圖代碼:
另外,我們在
User
模型類中添加了構造函數,對建立的User對象的Id和CreateTime,設定了預設值,是以我們在建立的時候就不必要再輸這兩個值了,編輯
Views/Users/Create.cshtml
,去掉這兩個屬性的代碼:
編輯
Views/Users/Edit.cshtml
,将編輯
CreateTime
的輸入框修改為隐藏類型,編輯的時候不需要輸入了:
最後,我們再修改一下
Views/Users/Index.cshtml
,在清單頁裡添加ID列,把它顯示出來:
至此我們代碼修改完畢。
測試運作
完成以上的建立和修改,我們直接在本機上先測試運作一下,頁面效果如下:
首頁上多了一個
User
菜單,我們點選這個菜單項後,顯示如下頁面:
這個是使用者清單頁面,因為我們還未添加任何使用者,是以目前清單是空的。我們點選"Create New"連結,跳轉至添加使用者的頁面,來添加一個新使用者試試:
注意:性别是布爾類型的,我們輸入
true
或
false
來表示,點選
Create
按鈕添加使用者,成功後自動跳轉到使用者清單頁面,如下圖所示:
添加完成後,清單頁面上顯示出了一條記錄,為了印證記錄已經插入到
sys_user
表裡,我們打開達夢的資料庫管理工具進行檢視:
接下來,我們再測試一下編輯、詳細、删除操作,也都沒有問題,這裡不再貼圖,到此我們完成了簡單的測試,下一步将項目先釋出到本地,然後部署到Web伺服器上。
注意,我們釋出的時候需要修改一下資料庫的連接配接字元串,連接配接位址要修改為伺服器上的資料庫,然後在程式包管理器控制台上再次運作
update-database
指令,主要目的是在伺服器上建立資料庫,當然如果已經建立了就不用去執行這個指令了。然後,依次點選
生成->釋出DmExample
,彈出釋出配置視窗,釋出目标選擇”檔案夾“:
檔案夾位置預設即可,然後點選”完成“按鈕
摘要處預設即可,點選"釋出"按鈕,完成釋出操作,系統會将編譯的釋出版本複制到指定的目标位置。
項目部署
項目的部署請參考《國産化之路-安裝WEB伺服器》章節中的”釋出站點“,這裡不再詳細介紹,這裡補充一項,在釋出站點的時候我們需要配置反向代理,ASP.NET Core預設釋出的端口号是
5000
,是以在配置節中我們設定的端口号對應的也是
5000
,但當我們的Web伺服器釋出多個站點時,不能使用同一個端口,那麼我們如何去修改ASP.NET Core預設釋出的端口号呢?經查閱資料,我們隻需要在
appsettings.json
的配置檔案裡添加
urls
配置屬性即可,具體如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DmExample": "Server=localhost;Database=DmExampleDB;User=SYSDBA;Password=dx2263111;"
},
"urls": "http://localhost:5005"
}
我們這裡設定的預設端口為
5005
,然後在Web伺服器裡對該站點的反向代理中的端口号做相應的調整:
# DmExample
location / {
proxy_pass http://localhost:5005;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
一切準備就緒,在Web伺服器上釋出完成後,打開站點顯示正常,但是當我們插入一條使用者資料後報錯了。
糾錯
同一個站點,在我們的開發機上測試都沒有問題,然後釋出到統信的作業系統下就出問題,接着又試了一下将資料庫連到Web伺服器,運作環境還是在開發機上試了一下也沒有問題,應該來講大機率就是環境問題了,那環境問題導緻哪裡出問題了呢?上面的錯誤資訊,并沒有告訴我們問題出在哪裡,大概意思是講讓我們切換成開發模式可以檢視到更詳細的錯誤資訊,那麼我們切換成開發模式看看,暫停這個站點的守護程序,使用終端進入站點目錄執行下面指令:
# 切換成"Development"模式
export ASPNETCORE_ENVIRONMENT=development
# 運作站點
dotnet DmExample.dll
然後使用浏覽器打開該站點,執行使用者插入操作,頁面顯示資訊變成如下顯示:
回報的應該是插入的某個字段資料類型不對,原本輸入的是數字的位置輸入了非數字的字元,導緻無法插入造成的,但未給出具體是哪個字段,分析我們目前的使用者資料類型也就隻有年齡是數字類型的,但這個有點不太可能,我們輸入的确實是數字,其它和數字搭邊的就是日期類型了。我們對這兩個字段做了排查,結果發現是日期類型
DateTime
的原因,那為什麼會這樣呢?我們做一個簡單的日期類型輸出然後分别在開發機上和Web伺服器上去運作試試看,結果如下:
上圖第一張是在windows開發機上輸出,第二張是在統信UOS上輸出。第一個時間是
DateTime.Now
輸出,第二個時間是特定時間輸出,主要目的是為區分上下午。很明顯看到,在開發機上是24小時格式的,但統信UOS是12小時格式的,并用中文辨別出了
上午
、
下午
,在插入的時候就現了問題,但看了統信UOS時間設定也是24小時制的,網上找了一下,這個問題并不是隻是統信UOS獨有的,在Linux上都有這個問題,找了一下解決辦法,需要在程式開始時設定
CultureInfo.DefaultThreadCurrentCulture
,我們可以把它加在
Program
的
Main
入口上,代碼如下:
public static void Main(string[] args)
{
// 跨平台 DateTime 中文 上午 下午 解決方案
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("zh-CN", true)
{
DateTimeFormat = { ShortDatePattern = "yyyy-MM-dd",
FullDateTimePattern = "yyyy-MM-dd HH:mm:ss", LongTimePattern = "HH:mm:ss" }
};
CreateHostBuilder(args).Build().Run();
}
CultureInfo.DefaultThreadCurrentCulture
屬性用來 擷取或設定目前應用程式域中線程的預設區域性,從上面的代碼了解是,将其設定中文區域,然後指定了短日期、完整時間以及長時間的格式,這裡注意
HH
和
hh
的差別,
HH
是24小時制的,而
hh
是12小時制的。我們在日期輸出小例子裡加上這一段代碼然後再看看其在來個系統統上的輸出是怎麼樣的:
上圖第一張是windows開發機,第二張是統信UOS,我們發現時間格式已經和開發機上格式一緻了,然後我們再次釋出站點,進行測試,問題解決。
小結
通過以上的簡單案例,我們實作了在統信UOS作業系統,基于達夢D8資料庫,使用.net core 3.1和EntityFramework core的簡單增、删、改、查的操作,在這個過程中我們發現windows和Linux類作業系統日期顯示格式的不同對我們所開發的應用造成的影響,這個問題應該并不是統信UOS獨有的問題。我們目前隻是個開端,随着業務的深入,所遇到的問題也将會越來越複雜,具體問題需要具體分析,不管是什麼樣的問題我們相信都有解決辦法。
參考資料
DateTime中文上午下午解決方案:https://blog.csdn.net/i2blue/article/details/105798392
CultureInfo.DefaultThreadCurrentCulture屬性介紹:https://docs.microsoft.com/zh-cn/dotnet/api/system.globalization.cultureinfo.defaultthreadcurrentculture?view=netcore-3.1
在 ASP.NET Core 中使用多個環境:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-3.1
EF Core連接配接達夢資料庫參考1:https://blog.csdn.net/lordwish/article/details/104501226
EF Core連接配接達夢資料庫參考2:https://blog.csdn.net/lordwish/article/details/108532022