ASP.NET Core MVC+EF Core从开发到部署

笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令、Shell脚本以及Linux下的各种应用的安装、配置、运行。使用下来的感受是Linux确实相当好使,熟悉基本操作之后的工作的效率提升不是一星半点,况且现在Linux的使用面已经相当广泛,随着.NET的跨平台战略的落地实施(.NET Core),.NET程序员也很有必要熟悉Linux下的.NET开发。因此这篇博客,我们就讲解一下ubuntu下的asp.net core mvc开发。

一、准备工作

首先介绍一下我的开发环境:

1、操作系统:ubuntu 16.04 

ubuntu是目前主流的linux桌面系统,官方网站:https://www.ubuntu.com/download。

2、开发工具:vscode 1.22.2

vscode(visual studio code,简称vscode)是微软提供的跨平台的代码编辑器,可以通过安装扩展支持多种编程语言(C#、C++、Python、Node.js等等)。如果你觉得vs太重,可以试试这个轻量级的vscode,官方网站:https://code.visualstudio.com/。

3、运行环境:.net core 2.1

.net core是微软官方出的.net的跨平台版本,我们开发跨平台的web应用,使用的asp.net core mvc需要安装.net core运行环境,官方网站:https://dotnet.github.io/

4、数据库:mysql 5.7

mysql不用多介绍了,数据库领域三巨头(oracle、mysql、sqlserver)之一,免费开源的跨平台数据库。自带的MySQL Workbench可以非常方便的操作mysql。据说微软的sqlserver也推出了linux版,以后有机会再试一试。官方网站:https://www.mysql.com/。

5、web server:jexus 5.8.3

我们开发好的asp.net core mvc应用发布后,需要一个web server提供运行环境,jexus就是linux下免费开源的asp.net web server。这里无需对jexus多做介绍,详细的内容可以去官方网站:https://www.jexus.org/查询。

怎么安装如上的环境,这里限于篇幅,不重点介绍。相信读者根据官方文档(一定要仔细查阅)或者百度就可以顺利完成上述环境的准备。我们这篇博客的目标就是在ubuntu下,使用vscode开发asp.net core应用,并通过ef core完成数据的持久化,数据库使用免费开源跨平台的mysql,最终将发布好的asp.net core mvc应用在jexus里承载,并让jexus随机启动,这样我们一启动好电脑,就能打开我们的asp.net core mvc应用了。

关于本次项目案例,这里我选择一个现成的方案——参会报名应用,它来自于《Pro Entity Framework Core 2 for ASP.NET Core MVC》这本书,网上有免费电子英文版。这里也顺便推荐一下这本书,这本书的特点就是为初学者准备了几个简要的开发案例,配备详细的实现步骤和截图,学习体验非常好(这里不得不佩服国外人写的教程)。

640?wx_fmt=jpeg

 

你必须掌握的Entity Framework 6.x与Core 2.0

作者:汪鹏

当当 广告
购买

二、使用vscode开发asp.net core应用

在ubuntu中,按ctrl+alt+t快捷键,打开控制台,输入dotnet --version命令,查看.net core版本,确保正确安装。

640?wx_fmt=jpeg

然后我们输入dotnet new mvc命令,创建asp.net core mvc应用。

640?wx_fmt=jpeg

看到如上显示的Restore succeeded即创建成功。

然后我们使用vscode打开这个目录,可以看到如下图所示的项目目录结构。

640?wx_fmt=jpeg

如果有提示,要你安装C#扩展,点击Yes安装即可。

640?wx_fmt=jpeg

从截图可以看到,通过vscode为我们展示的asp.net core mvc的项目结构非常清晰。Controller对应控制器,Models对应模型类,Views对应视图,wwwroot存放一些静态资源,包括js、css、img、lib(bootstrap、jquery)。几个配置文件都是json格式的文件,熟悉json的也没什么问题。还有1个csproj文件,普通的C#项目都会有这个文件。还有两个cs文件,分别为Program.cs和Startup.cs,其中Program.cs中的Main方法是程序的运行入口,Startup.cs是项目启动时的一些配置信息,比如添加mvc支持,路由的设置等等。

vscode中看到的asp.net net core应用就是一个完整可运行的版本。我们在vscode中,打开Program.cs文件,在BuildwebHost方法中,加上一行代码:

WebHost.CreateDefaultBuilder(args).UseStartup<Startup>()       .UseUrls(new string[]{"http://localhost:5001","http://localhost:5002"}).Build();

然后在vscode界面下,按ctrl+f5快捷键(或者点击vscode菜单栏中的Debug-Start Without Debugging)直接运行该项目,即可访问我们创建的asp.net core应用。

640?wx_fmt=jpeg

 





 默认url是:localhost:5001,localhost:5002也可以访问,这就是我们通过添加了UseUrls方法后所起到的作用。

此时的vscode状态截图如下:

640?wx_fmt=jpeg

我们通过中间的导航栏可以看到,此时的vscode处于运行状态,我们可以通过快捷键shift+f5或者点击红色方块按钮,停止项目运行。

640?wx_fmt=jpeg

 或者切换到asp.net core的项目目录下,输入dotnet run命令,启动运行asp.net core项目。

640?wx_fmt=jpeg

 

三、添加EF Core

在vscode项目中使用EF Core连接mysql,需要添加引用Microsoft.EntityFrameworkCore和MySql.Data.EntityFrameworkCore包。

点击菜单栏-View-Command Palette-Nuget Package Manager:Add Package,输入Microsoft.EntityFrameworkCore,按回车。选择版本,自动添加引用。 

640?wx_fmt=jpeg

 MySql.Data.EntityFrameworkCore包安装方式也是一样。安装好之后vscode右下角会提示要Restore项目,点击Restore即可。

640?wx_fmt=jpeg

这样,我们就可以为UseMySQL方法引入namespace了。

注意:关于该程序的具体代码,这里不再详细给出,本文最后会放出该项目的完整代码。

开发完毕后,我们可以打开控制台,切换到asp.net core的目录下,用ef core命令生成数据库。

输入的命令为:dotnet ef migrations add Initial,但却发生如下的错误提示:

640?wx_fmt=jpeg

这个错误提示就是没有找到匹配的dotnet ef命令。我们打开项目的csproj文件,加入如下的配置信息。

<ItemGroup>  <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />  <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />   </ItemGroup>

编辑后的完整配置信息如下:

640?wx_fmt=jpeg

我们在控制台再次执行dotnet ef migrations add Initial命令。又出错了,错误截图如下:

640?wx_fmt=jpeg

错误提示信息:不能将concretetypemapping转换为relationaltypemapping类型。感觉应该是Microsoft.EntityFrameworkCore的版本较高,API写法进行了调整,需要写新的类型转换代码。这个问题先放一放,后面有时间再研究一下。网上百度了一番,说是Microsoft.EntityFrameworkCore的版本过高,我们用的是2.1.1版本,降低到2.0.2版本即可。

同样的操作,vscode菜单栏-view-command palette-Nuget Package Manager:Add Package,输入Microsoft.EntityFrameworkCore,按回车。选择版本2.0.2版本,自动添加引用。最终修改后的csproj文件如下:

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>netcoreapp2.0</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6"/><PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.2"/><PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.11"/></ItemGroup><ItemGroup><DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3"/></ItemGroup><ItemGroup><DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0"/><DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0"/></ItemGroup></Project>

再次执行ef core迁移命令,这次终于成功了。

640?wx_fmt=jpeg

这时我们回到vscode编辑器,看到项目中已经多了一个Migrations文件夹。

640?wx_fmt=jpeg

回到控制台界面,输入:dotnet ef database update命令。

640?wx_fmt=jpeg

可以看到已经通过ef core成功的在mysql中创建了数据库和表。我们打开mysql workbench,看看数据库test中的内容。

640?wx_fmt=jpeg

OK!至此开发方面的问题就都解决好了。只差最后一步,将我们的项目发布,并host在web server中了。

 

四、发布、部署

发布asp.net core mvc项目很简单,通过publish命令就可以了。我们可以先新建一个目录,以便将文件发布到该路径。

发布命令:dotnet publish -o /home/guwei4037/webapp,这样就将项目发布到了/home/guwei4037/webapp路径中。

640?wx_fmt=jpeg

项目发布完成之后,我们需要将该项目部署到jexus中。

我们将jexus放入到/usr/jexus目录中。然后编辑/usr/jexus/siteconf里的default文件内容。

######################
# Web Site: Default 
########################################port=80root=/ /home/guwei4037/webapp# hosts=*    #OR your.com,*.your.com# reproxy=/ http://localhost:5000/# addr=0.0.0.0
# CheckQuery=false
NoLog=true AppHost={cmd=dotnet /home/guwei4037/webapp/firstcore.dll;root=/home/guwei4037/webapp;Port=5001,5002}
# NoFile=/index.php # Keep_Alive=false # UseGZIP=false# UseHttps=true # ssl.certificate=/x/xxx.crt #or pem # ssl.certificatekey=/x/xxx.key # ssl.protocol=TLSv1.0 # TLSv1.1 or TLSv1.2 # ssl.ciphers=# AppHost.Port=5000 # AppHost={cmd=dotnet /var/www/default/your.dll; root=/var/www/default; port=5000}# DenyFrom=192.168.i0.233, 192.168.1.*, 192.168.2.0/24 # AllowFrom=192.168.*.* # DenyDirs=~/cgi, ~/upfiles # indexes=myindex.aspx # rewrite=^/.+?\.(asp|php|cgi|pl|sh)$ /index.aspx # reproxy=/bbs/ http://192.168.1.112/bbs/ # host.Redirect=abc.com www.abc.com 301 # ResponseHandler.Add=myKey:myValue# Jexus php fastcgi address is '/var/run/jexus/phpsvr' ####################################################### # fastcgi.add=php|socket:/var/run/jexus/phpsvr# php-fpm listen address is '127.0.0.1:9000' ############################################ # fastcgi.add=php|tcp:127.0.0.1:9000

指定port端口号为80端口,root为/根目录,后面的/home/guwei4037/webapp为项目的发布路径,中间有1个空格隔开。NoLog=true意为不记录日志,这样网站访问速度会比较快,缺点是没有记录日志,遇到问题不能根据日志信息很快定位。AppHost={cmd=dotnet /home/guwei4037/webapp/firstcore.dll;root=/home/guwei4037/webapp;port=5001,5002},其中cmd指定程序运行方式,后面的路径为启动的文件,root为根目录,port配置支持多端口。

640?wx_fmt=jpeg

jexus配置好了,并且也重新启动了。我们就可以打开localhost看看应用访问是否正常。

640?wx_fmt=jpeg

可以正常打开了。

赶紧使用一下里面的功能呢,都是OK的。

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

jexus已经成功的host了我们的应用,那么最后一步,如何让jexus随机启动呢?在jexus的安装配置要点(https://www.linuxdot.net/bbsfile-3084)里面已经给出了答案:

开机自动启动:
在/etc/rc.local 或类试的开机启动脚本中加入下面这一行命令:
mono /usr/jexus/jws.exe >/dev/null 2>&1 &
或者
/usr/jexus/jws.start  #推荐方式

由于我们引用了bootstrap,在ubuntu下用ifconfig命令查看一下本机的ip,然后用你的手机浏览器输入这个ip就可以在手机上面注册参会了。

 

参考资料:

1、彻底解决mysql中文乱码

2、jexus安装配置要点

 3、asp.net core发布和部署

 4、Table 'db.__EFMigrationsHistory' doesn't exist

 5、Creating a Database with Code First in EF Core

原文地址:https://www.cnblogs.com/guwei4037/p/9197887.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初一模拟赛(4.27)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf320320320100100100100100100100100100202020222hkyhkyhky296296296100100100100100100868686101010333wjjwjjwjj276276276100100100909090868686000444fyfyfy24824824810010010…

P4145-上帝造题的七分钟2/花神游历各国【并查集,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P4145 题目大意 一个序列要求支持 区间开根向下取整区间求和 解题思路 一个数开根约logloglog次就会到111&#xff0c;所以我们对于每个数记录一下开根多少次会到111&#xff0c;每次修改用并查集找还没到111的暴力修改树状…

网络流及建模专题(上)

前言 不断更新中…… 这几天新坑填不下去了&#xff0c;回来回顾一些经典的模型套路&#xff0c;先拿网络流开刀&#xff0c;窃以为洛谷这几道网络流的题目还是非常具有代表性的&#xff0c;涵盖了网络流调整、多解计数、最小割、最大权闭合子图问题。 还涵盖了图论&#xff0…

基于 websocket 实现的 im 实时通讯案例

分享利用 redis 订阅与发布特性&#xff0c;巧妙的现实高性能im系统。为表诚意&#xff0c;先贴源码地址&#xff1a;https://github.com/2881099/im下载源码后的运行方法&#xff1a;运行环境&#xff1a;.NETCore 2.1 redis-server 2.8下载Redis-x64-2.8.2402.zip&#xff0…

【并查集】【图论】旅行(ssl 1312)

旅行 ssl 1312 题目大意&#xff1a; 有一个图&#xff0c;要从一个点到另一个点&#xff0c;问路上的最大值和最小值的比最小是多少 原题&#xff1a; 题目描述 Z小镇是一个景色宜人的地方&#xff0c;吸引来自各地的观光客来此旅游观光。Z小镇附近共有N个景点&#xff…

P4302-[SCOI2003]字符串折叠【区间dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4302 题目大意 一个字符串&#xff0c;对于一个字符串AAA。可以将连续的nnn个AAA缩成n(A)n(A)n(A)。求最短的长度能够表述出给定字符串 解题思路 定义fi,jf_{i,j}fi,j​表示表示出i∼ji\sim ji∼j的字符串的最短方法。那么…

ACM/ICPC 比赛生涯总结+经验分享

ACM/ICPC 比赛生涯总结经验分享 1.获奖经历 时间比赛奖励大一下ACM陕西省赛打铁大一下CCCC团队二等奖大二下ACM/ICPC全国邀请赛银奖大二下CCCC团队特等奖大三上ACM/ICPC区域赛沈阳站铜奖大三上ACM/ICPC区域赛南宁站银奖大三上ACM/ICPC EC-Final上海铜奖大三下CCCC团队特等奖大…

YbtOJ#20064-[NOIP2020模拟赛B组Day4]预算缩减【树形dp】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/2 题目大意 nnn个点的一棵树&#xff0c;求删掉一些边让剩下的连通块大小不小于kkk&#xff0c;求方案数。 解题思路 定义fi,jf_{i,j}fi,j​表示iii的子树现在联通块大小为jjj时的方案数&#xff0c;我们不难发现…

【并查集】团伙(luogu 1892)

团伙 luogu 1892 代码&#xff1a; 定义对手的对手是朋友&#xff0c;朋友的朋友是朋友&#xff0c;现在有n个人和m组关系&#xff0c;如果两个人是朋友那么他们属于同一个团伙&#xff0c;问有多少个团伙 原题&#xff1a; 题目描述 1920年的芝加哥&#xff0c;出现了一…

NCC Meetup 2018 Shanghai 活动小结

NCC Meetup 2018 上海的活动于2018年6月30日在微软上海港汇办公室进行。原本计划30人规模的小型活动&#xff0c;结果收到了逾60人的报名&#xff0c;其中大部均来到现场参加了活动。本次活动得到了微软公司的场地支持&#xff0c;同时非常感谢 范亮先生、 刘浩杨先生和 邹嵩…

【结论】Array

Array 题目大意&#xff1a; 有一个数列&#xff0c;随机交换两个数&#xff0c;原数列和当前数列相同部分有可能有多少个 原题&#xff1a; 题目描述 Alice 有一个数列 ai。 但是她不喜欢这个数列&#xff0c;于是她决定随机交换其中两个数。 Alice 想知道&#xff0c;交…

YbtOJ#20065-[NOIP2020模拟赛B组Day4]模拟比赛【dp】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/3 解题思路 有nnn道题&#xff0c;mmm个人。一些题目是让某些人一定得分&#xff0c;一些题目是让某些人可以能得分。 求排名前sss的人选出ttt个人&#xff0c;可能的集合个数。 解题思路 显然我们如果要判断一…

Asp.Net Core 使用Quartz基于界面画接口管理做定时任务

今天抽出一点点时间来造一个小轮子&#xff0c;是关于定时任务这块的。这篇文章主要从一下几点介绍&#xff1a;创建数据库管理表创建web项目引入quarzt nuget 包写具体配置操作&#xff0c;实现定时任务处理第一步&#xff1a;创建一个空web项目&#xff0c;引入quarzt nuget …

YbtOJ#20066-[NOIP2020模拟赛B组Day4]筹备计划【线段树,树状数组】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/4 题目大意 一个集合[1,n]∈S[1,n]\in S[1,n]∈S&#xff0c;和一个序列aaa。有操作 序列aaa的一个数加上xxx序列aaa的一个数减去xxx将[l,r][l,r][l,r]加入集合SSS将[l,r][l,r][l,r]删除出集合SSS 每次修改后求…

【模拟】Biotech

Biotech 题目大意&#xff1a; 有一堆细胞&#xff08;放电或不放电&#xff09;&#xff0c;当周围细胞放电个数小于2或大于3时&#xff08;八个方向&#xff09;&#xff0c;此细胞变为不放电&#xff0c;当周围细胞放电个数为2时&#xff0c;此细胞不变&#xff0c;当周围…

.NET Core微服务之服务间的调用方式(REST and RPC)

一、REST or RPC ?1.1 REST & RPC微服务之间的接口调用通常包含两个部分&#xff0c;序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等&#xff1b;通信比较流行的是http、soap、websockect&#xff0c;RPC通常基于TCP实现&am…

【记忆化搜索】【dfs】【递归】Chocolate

Chocolate 题目大意&#xff1a; 有一块巧克力&#xff08;每一个单位有一定的美味值&#xff09;&#xff0c;判断是否可以把他分为k块美味值相等的小巧克力 原题&#xff1a; 题目描述 Charlie 有一块巧克力。 这块巧克力是矩形的&#xff0c;有 n 行 m 列一共 n m 个大…

YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/1 题目大意 给出一个010101序列&#xff0c;求有多少对(l,p,r)(l,p,r)(l,p,r)使得l<p<rl<p<rl<p<r且sp1s_p1sp​1且s(l,p)s(p,r)s(l,p)s(p,r)s(l,p)s(p,r)&#xff08;s(l,r)s(l,r)s(l,r)表示l…

Nuget 多平台多目标快速自动打包

构建现代的 .Net 应用离不开 Nuget 的支持&#xff0c;而快速打包 Nuget 成了提高生产率的有效方法。1. 前置条件为了实现 Nuget 的快速打包&#xff0c;我们需要先解决一些前置依赖&#xff0c;无论是 .Net Framework、Mono 或者 .Net Standard&#xff08;.Net Core&#xff…

P4495-[HAOI2018]奇怪的背包【数论,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4495 题目大意 nnn个物品大小为viv_ivi​&#xff0c;每个物品有无数个&#xff0c;背包的重量定义为大小和%P\%P%P。 qqq次询问&#xff0c;问一个www表示有多少种取法使得背包重量为www&#xff08;两种方案不同仅当有一种…