國產化之路-統信UOS操做系統安裝
國產化之路-國產操做系統安裝.net core 3.1 sdk
國產化之路-安裝WEB服務器
國產化之路-安裝達夢DM8數據庫
國產化之路-統信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 達夢DM8實現簡單增刪改查操做html
通過前期的準備工做,.net core 3.1的運行環境和WEB服務器已經搭建完畢,這裏須要注意一下,達夢DM8數據庫對於Entity Framework Core 3.1 的驅動在NuGet官方源上並無正式發佈,須要從Win64安裝版本中的drivers/dotNet
提取,這裏須要事先準備。web
出於開發的習慣和便利性,項目的開發和調試都仍是在windows的環境下面進行,打開Visual Studio 2019,建立新項目,使用ASP.NET Core web應用程序
模板,項目名稱本身取一下,我這裏取名DmExample
,版本選擇ASP.NET Core 3.1
,爲HTTPS 配置
勾選去掉,暫時不須要HTTPS數據庫
點擊」建立「按鈕後,稍微等待一下子,默認的MVC項目搭建完成。在Controllers
目錄下只有一個HomeController.cs
文件,點擊運行看一下:json
已經能夠正常跑起來,接下來咱們要在這個基礎下開始添加模型、鏈接達夢數據庫、建立數據庫、添加簡單的增刪改查的操做。c#
在添加應用以前,爲了可以鏈接數據庫和建立表,咱們首先要使用NuGet包管理工具,安裝以下支持包:windows
Microsoft.EntityFrameworkCoreapi
Microsoft.EntityFrameworkCore.Tools瀏覽器
Microsoft.EntityFrameworkCore.Design服務器
安裝完以上包後,咱們須要安裝EF Core的達夢數據庫驅動,前面提到過在官方的NuGet源中並無達夢的EF Core驅動,但在達夢的安裝盤上有提供,因此須要對NuGet包管理器的程序包源進行添加設置,將達夢數據庫安裝源中的EFCore.Dm3.1
,DmProvider
做爲包源引入,而後再安裝。app
在NuGet包管理器中,點擊右上角(紅框框起來的齒輪圖標),彈出選項窗口:
點擊窗口右上角的加號圖標,而後名稱輸入EFCore.Dm3.1
,源路徑選擇你光盤鏡像下面的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