. 愛留圖網站誕生html
. git源碼:https://github.com/shenniubuxing3/LovePicture.Webgit
. AspNetCore - MVC實戰系列(一)之Sqlserver表映射實體模型github
. AspNetCore-MVC實戰系列(二)之經過綁定郵箱找回密碼web
. AspNetCore-MVC實戰系列(三)之我的中心sql
. AspNetCore-MVC實戰系列(四)之帳戶設置數據庫
本章開篇先簡單介紹下最近兩週本身利用業餘時間作的一個圖片收集網站,固然這個是靠用戶本身上傳來收集不是去抓某些個網站的圖片,那樣沒意義,這裏我取名爲「愛留圖」;該網站的簡單介紹你們能夠參考下上篇的內容愛留圖的誕生,這裏打算經過一些列的博客講解如何一步步利用aspnetcore的mvc來開發,但願你們可以喜歡;json
首先,咋們須要在sqlserver中建立一張用戶表To_UserInfo,這裏我儘可能簡單取一些屬性做爲字段,如下是表結構SQL:mvc
USE [LovePicture.Db] GO /****** Object: Table [dbo].[To_UserInfo] Script Date: 2017/4/25 17:30:53 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[To_UserInfo]( [Id] [int] IDENTITY(1,1) NOT NULL, [UserName] [nvarchar](50) NOT NULL, [UserPwd] [nvarchar](50) NOT NULL, [Email] [nvarchar](50) NULL, [NickName] [nvarchar](20) NULL, [Tel] [nvarchar](20) NULL, [Sex] [bit] NOT NULL, [Introduce] [nvarchar](200) NULL, [HeadPhoto] [nvarchar](200) NULL, [Birthday] [nvarchar](20) NULL, [Addr] [nvarchar](200) NULL, [Blog] [nvarchar](200) NULL, [Status] [int] NOT NULL, [CreateTime] [datetime] NOT NULL, [LoginTime] [datetime] NULL, [Ips] [nvarchar](50) NULL, [LevelNum] [int] NOT NULL, CONSTRAINT [PK_To_UserInfo] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
字段的意思沒必要太明瞭,主要是學習怎麼生成實體;先建立一個類庫LovePicture.Model,因爲這裏我打算使用EF Core(全名:entity framework core),所以須要對這個類庫安裝相應的nuget包:app
Microsoft.EntityFrameworkCore.Design 框架
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
注意啦是4個包,netcore官網給出的只有後面3個包沒有第一個,有實際經驗得出若是你不添加第一個包,那麼由數據庫來生成實體模型的時候會提示錯誤,這裏我就不截圖錯誤信息了有興趣的朋友可嘗試;來到這裏咋們還須要經過vs控制檯輸入執行命令:
Scaffold-DbContext "Server=127.0.0.1,1431;User Id=sa;Password=123123;Database=LovePicture.Db;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
簡單說下參數吧:
. Scaffold-DbContext:執行命令
. Server=...:數據庫連接字符串
. -OutputDir Models:輸出實體到名稱爲Models的文件夾中
我的領悟的注意事項:
vs2017可能存在的一個問題,當第一次須要在新建立的類庫中使用反向工程生成實體模型的時候,若是您不設置該類庫爲起始項目,那會提示錯誤無法生成成功的;我遇到的時候用了不少方式嘗試解決問題,甚至覺得什麼東西安錯了,結果在Git的問題中心找到了相關問題的回答,僅僅只須要設置下啓動項就能解決,真實讓我吃驚呢。
到這裏若是你按照以上我列舉的步驟操做,應該不會出現太大的問題可以經過sqserver數據庫生成實體成功,固然不保證其餘特殊的狀況吧;
首先,經過vs2017建立個Aspnetcore的Mvc項目我取名爲LovePicture.Web,咱們要了解的是netcore項目基本上都是經過nuget包來引入其餘組件,可是強大的vs可以讓咱們直接經過:右鍵web項目的「依賴項」-》添加引用-》解決方案-》選擇其餘項目的名稱,以此來添加對其餘項目的依賴(主要是新的vs版本因此廢話一下);
有了依賴關係咱們先來改造一下經過反向工程生成的DbContext代碼來知足咱們在Web中Mvc的使用;打開模型類庫中的LovePicture_DbContext.cs文件,可以看到咱們比較熟悉相似於其餘EF框架版本的結構,這裏咱們只須要自動生成的LovePicture_DbContext構造函數刪除掉,而後從新添加一個這樣的構造函數:
1 public LovePicture_DbContext(DbContextOptions<LovePicture_DbContext> options) : base(options) { }
這樣就能吧DbContext當作注入服務提供給引入這個類庫的項目使用了,咱們也僅僅只須要在Web項目中的Startup.cs文件的ConfigureServices方法中添加依賴注入便可:
1 //添加數據庫上下文 2 services.AddDbContext<LovePicture_DbContext>(b => 3 { 4 5 var dbLink = Configuration.GetSection("MoSelfSetting:DbLink").Value; 6 if (string.IsNullOrWhiteSpace(dbLink)) { throw new Exception("未找到數據庫連接。"); } 7 8 b.UseSqlServer(dbLink); 9 10 });
這裏因爲連接數據庫的話須要有一個鏈接串,這裏經過DbContextOptionsBuilder的UseSqlServer擴展方法來傳遞,字符串的來源這裏我配置在appsettings.json配置文件中的,所以可以很方便的經過 Configuration.GetSection("MoSelfSetting:DbLink").Value 來讀取出配置文件中配置的鏈接串,固然若是能夠你也能夠直接在這裏吧鏈接串寫死都行,這裏截圖展現下配置文件的層級關係:
好了有了以上的配置,咋們就可以在MVC的Controller中很好的使用DbContext了,這裏經過構造函數注入的方式使用:
1 private readonly LovePicture_DbContext _db; 2 public HomeController(LovePicture_DbContext db) 3 { 4 _db = db; 5 }
到這裏Controller中就可以使用DbContext了,咱們能夠在Action中直接經過各類EF的操做方法來對數據庫執行讀寫命令;
由於後面文章內容涉及到用戶上傳頭像等信息,因此須要一些可配置的信息(如:上傳路徑,連接字符串),因此這裏須要有讀取咱們自定義配置節點信息的操做;這裏使用現成的appsettings.json文件來配置信息,這裏個人配置內容如:
1 { 2 "Logging": { 3 "IncludeScopes": false, 4 "LogLevel": { 5 "Default": "Warning" 6 } 7 }, 8 "MoSelfSetting": { 9 //圖片內容路徑 10 "UpHeadPhotoPath": "D:\\F\\學習\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\upfile\\headphoto", 11 "ViewHeadPhotoPath": "/upfile/headphoto", 12 //頭像路徑 13 "UpContentPhotoPath": "D:\\F\\學習\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\upfile\\contentphoto", 14 "ViewContentPhotoPath": "/upfile/contentphoto", 15 //郵箱模板 16 "EmailTplPath": "D:\\F\\學習\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\tpl", 17 //連接字符串 18 "DbLink": "Server=127.0.0.1,1431;User Id=sa;Password=123123;Database=LovePicture.Db;" 19 } 20 }
要獲取這個文件的自定義信息,咱們須要建立一個對應屬性名稱的實體MoSelfSetting:
1 /// <summary> 2 /// 自定義配置 3 /// </summary> 4 public class MoSelfSetting 5 { 6 /// <summary> 7 /// 頭像圖片保存地址 8 /// </summary> 9 public string UpHeadPhotoPath { get; set; } 10 11 /// <summary> 12 /// 頭像圖片訪問地址 13 /// </summary> 14 public string ViewHeadPhotoPath { get; set; } 15 16 /// <summary> 17 /// 內容圖片保存地址 18 /// </summary> 19 public string UpContentPhotoPath { get; set; } 20 21 /// <summary> 22 /// 查看內容圖片保存地址 23 /// </summary> 24 public string ViewContentPhotoPath { get; set; } 25 26 /// <summary> 27 /// 郵件模板文件夾路徑 28 /// </summary> 29 public string EmailTplPath { get; set; } 30 31 /// <summary> 32 /// 數據庫連接 33 /// </summary> 34 public string DbLink { get; set; } 35 }
實體類屬性名稱和appsettings.json文件的節點名稱同樣就好了,而後在ConfigureServices方法中添加配置文件設置:
1 //設置自定義配置信息 2 services.Configure<MoSelfSetting>(Configuration.GetSection("MoSelfSetting"));
僅僅只須要使用這段代碼,就能完成從json配置文件的數據到實體數據的轉化,比之前的確方便了不少;而後一樣經過在Controller中使用IOptions<T>來注入這個配置文件實體到Controller中:
1 private readonly LovePicture_DbContext _context; 2 private readonly MoSelfSetting _selfSetting; 3 private readonly IMemoryCache _cache; 4 5 public MemberController(LovePicture_DbContext context, IOptions<MoSelfSetting> selfSetting, IMemoryCache cache) 6 { 7 _context = context; 8 _selfSetting = selfSetting.Value; 9 _cache = cache; 10 }
最後經過IOptions<T>.Value方式,直接就可以獲取出具備配置文件信息的實體數據了;這裏就再也不寫測試用例了,這些都會在後面一些列章節中運用到,但願本篇文章能給你好的收穫,若是能夠不妨點個「贊」,謝謝。