引言
通过前期的准备工做,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里须要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官方源上并无正式发布,须要从Win64安装版本中的drivers/dotNet
提取,这里须要事先准备。html
建立项目
出于开发的习惯和便利性,项目的开发和调试都仍是在windows的环境下面进行,打开Visual Studio 2019,建立新项目,使用ASP.NET Core web应用程序
模板,项目名称本身取一下,我这里取名DmExample
,版本选择ASP.NET Core 3.1
,为HTTPS 配置
勾选去掉,暂时不须要HTTPSweb
点击”建立“按钮后,稍微等待一下子,默认的MVC项目搭建完成。在Controllers
目录下只有一个HomeController.cs
文件,点击运行看一下:数据库
已经能够正常跑起来,接下来咱们要在这个基础下开始添加模型、链接达梦数据库、建立数据库、添加简单的增删改查的操做。json
添加驱动
在添加应用以前,为了可以链接数据库和建立表,咱们首先要使用NuGet包管理工具,安装以下支持包:windows
Microsoft.EntityFrameworkCoreapi
Microsoft.EntityFrameworkCore.Tools浏览器
Microsoft.EntityFrameworkCore.Design服务器
安装完以上包后,咱们须要安装EF Core的达梦数据库驱动,前面提到过在官方的NuGet源中并无达梦的EF Core驱动,但在达梦的安装盘上有提供,因此须要对NuGet包管理器的程序包源进行添加设置,将达梦数据库安装源中的EFCore.Dm3.1
,DmProvider
做为包源引入,而后再安装。app
在NuGet包管理器中,点击右上角(红框框起来的齿轮图标),弹出选项窗口:dom
点击窗口右上角的加号图标,而后名称输入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