ASP.NET?Core使用EF?SQLite對(duì)數(shù)據(jù)庫(kù)增刪改查
SQLIte 操作方便,簡(jiǎn)單小巧,這里筆者就不再過(guò)多介紹,感興趣可以到以下博文
http://www.dbjr.com.cn/article/234142.htm
文章介紹創(chuàng)建ASP.NET Core 程序,創(chuàng)建模型、上下文,生成數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)增刪查改。
并對(duì)每個(gè)過(guò)程進(jìn)行詳細(xì)介紹,使初學(xué)者盡快了解內(nèi)容和相關(guān)知識(shí),避免對(duì)某一知識(shí)點(diǎn)懷疑、卡在某個(gè)位置。
1 新建ASP.NET Core MVC 應(yīng)用
1.1 新建MVC應(yīng)用
打開Visual Studio 2017,新建 ASP.NET Web應(yīng)用程序,選擇MVC(模型視圖控制器)。
1.2 引入NuGet 包
需要 引入
- microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Sqlite
引入教程
依賴項(xiàng)
-右鍵
--管理NuGet 程序包
輪流輸入并安裝microsoft.EntityFrameworkCore 、Microsoft.EntityFrameworkCore.Sqlite,下面附過(guò)程
注:
版本請(qǐng)選擇與自己 ASP.NET Core 版本接近的。
筆者版本 ASP.NET Core 版本為 2.1 ,選擇的 NuGet 包版本為 2.11。
如果你的 .Net Core 是最新的,那么 NuGet 也選最新的即可。
如果你選擇版本后,發(fā)現(xiàn)報(bào)錯(cuò),可以再進(jìn)入 NuGet 重新刪除安裝。
出現(xiàn)更新提示千萬(wàn)不用更新。
2 新建模型和上下文
這一步建立模型和上下文,后面將會(huì)根據(jù)這里的代碼生成數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)表!
需要建立一個(gè)上下文類和模型類,把模型類包含在上下文類中,上下文類中包含進(jìn)來(lái)的模型類,將會(huì)生成對(duì)應(yīng)的數(shù)據(jù)庫(kù)表。
下面這代碼不用自己操作,只需要看就行。(注意注釋部分)
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; namespace WebApplication1.Models { public class SqlContext:DbContext { public SqlContext(DbContextOptions<SqlContext> Options):base(Options) { } public DbSet<A> A { get; set; } //在數(shù)據(jù)庫(kù)中生成數(shù)據(jù)表A } public class A { public int ID { get; set; } } public class B { public int ID { get; set; } } }
上面代碼,有三個(gè)類,
- 其中 SqlContext 類是上下文類,
- A、B類為模型類,
- 但是,只讓A生成數(shù)據(jù)庫(kù)表,而B不會(huì)生成數(shù)據(jù)庫(kù)表。
- A、B都是模型類,因?yàn)榭梢员簧蓴?shù)據(jù)庫(kù)表,所以A也可以叫實(shí)體類,B因?yàn)闆](méi)有 DbSet<B> ,所以B叫模型類,不叫實(shí)體類。
- A類將會(huì)生成一個(gè)真實(shí)的數(shù)據(jù)庫(kù)中的表,有對(duì)應(yīng)關(guān)系,所以,他是“實(shí)體類”。
- B類沒(méi)有對(duì)應(yīng)的存在,只是模型,沒(méi)有實(shí)際存在的對(duì)象,所以只是叫“模型類”。
2.1 新建模型類
上面代碼把模型類、上下文類放到同一個(gè)文件 SqlContext.cs,這樣可讀性不太好。
因?yàn)橐粋€(gè)模型類,代表一個(gè)數(shù)據(jù)表,上下文類相當(dāng)于一個(gè)配置類,一個(gè)數(shù)據(jù)庫(kù)有幾十個(gè)表,每個(gè)表有幾個(gè)列,這樣會(huì)使文件內(nèi)容過(guò)于復(fù)雜。
我們可以降低耦合,每個(gè)類文件只存在一個(gè)類,每個(gè)類代表一個(gè)表,你要?jiǎng)?chuàng)建幾個(gè)表,就對(duì)應(yīng)寫幾個(gè)類。
實(shí)際操作
在 Models 文件夾中
- 新建一個(gè)類Users.cs
- 在類中直接寫代碼
public int ID { get; set; } //主鍵 public string Name { get; set; } //用戶名稱 public int Age { get; set; } //用戶年齡 public int Number { get; set; } //用戶手機(jī)號(hào)碼
如圖
注:
一個(gè)模型類 對(duì)應(yīng) 一個(gè)數(shù)據(jù)表(Table)
模型類的一個(gè)屬性 對(duì)應(yīng)一個(gè)列。
模型類只應(yīng)出現(xiàn)屬性,不應(yīng)該出現(xiàn)方法等。
筆者這里只寫一個(gè)表,如果你想要多個(gè)表,可以新建其它類,然后在上下文類中加入。
2.2 新建上下文
上面已經(jīng)建立模型類,模型類將成為數(shù)據(jù)表(Table)本身。然而他們不能直接對(duì)應(yīng)生成數(shù)據(jù)表,需要上下文來(lái)對(duì)模型類映射成數(shù)據(jù)表,不然他們只是普通的類。
在 Models 目錄新建 類MyContext.cs
在頭部引入 EF(EntityFrameworkCore )
using Microsoft.EntityFrameworkCore;
重寫 MyContext 類
步驟1
public class MyContext 改成 public class MyContext:DbContext //表示該類為上下文類,數(shù)據(jù)庫(kù)名稱為 My,類名稱為什么,數(shù)據(jù)庫(kù)名就為什么
步驟2
在MyContext類中寫一個(gè)構(gòu)造函數(shù)
public MyContext(DbContextOptions<MyContext> options) : base(options) { }
這個(gè)構(gòu)造函數(shù)涉及到依賴注入,這里不再贅述,只需要知道這個(gè)構(gòu)造函數(shù)能夠配置相關(guān)設(shè)置。
這里的構(gòu)造函數(shù)內(nèi)容為空,因?yàn)闀簳r(shí)沒(méi)有什么要配置的。
步驟3
在構(gòu)造函數(shù)下面加上代碼,對(duì)模型類進(jìn)行映射。
public DbSet<Users> Uaa { get; set; } //Dbset 映射成一個(gè)表 //Dbset<Users> 里面的Users即為使用的模型類 //Uaa Users 類在數(shù)據(jù)庫(kù)生成的名稱
注:
上面代碼表示以模型類Users為基礎(chǔ),在數(shù)據(jù)庫(kù)中生成 名為 Uaa 的 表。
一個(gè)上下文對(duì)應(yīng) 一個(gè) 數(shù)據(jù)庫(kù),上下文類 MyContext,Context 前面的部分將成為數(shù)據(jù)庫(kù)名稱。例如 asdwadaaContext,將生成數(shù)據(jù)庫(kù)asdwadaa。
一個(gè)模型類 對(duì)應(yīng) 一個(gè)數(shù)據(jù)表(Table)
完整代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; namespace WebApplication1.Models { public class MyContext:DbContext { public MyContext(DbContextOptions<MyContext> options) : base(options) { } public DbSet<Users> Uaa { get; set; } } }
生成的效果圖預(yù)覽
3 配置服務(wù)
為了讓應(yīng)用生成數(shù)據(jù)庫(kù)、使用到這個(gè)數(shù)據(jù)庫(kù),需要在Startup.cs
增加代碼
在頭部引入三個(gè) 庫(kù)
using WebApplication1.Models; //可能命名不同 using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Sqlite;
然后為 應(yīng)用注入服務(wù),有以下方式
(后面再解釋作用,現(xiàn)在先了解,不用加)
1 直接寫字符串
在Startup.cs 增加代碼
string connecttext = "Filename=F:\\MY.DB"; services.AddDbContext<MyContext>(options=>options.UseSqlite(connecttext));
2 使用JSON
在appsettings.json 文件加入內(nèi)容(注釋部分)
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", //注釋部分 "ConnectionStrings": { "MyContext": "Filename=F:\\MY.DB" //注釋部分 } }
然后 在 Startup.cs 增加代碼
string connecttext = Configuration.GetConnectionString("MyContext"); services.AddDbContext<MyContext>(options=>options.UseSqlite(connecttext));
注:
以上兩種方式,connecttext 變量的作用是獲取數(shù)據(jù)庫(kù)連接字符串,此變量沒(méi)有特殊意義,只是為了增加可讀性。
SQLite的連接字符串,只需要寫 "Filename=[絕對(duì)路徑]"
services.AddDbContext(options=>options.UseSqlite(“連接字符串”));
表示
向應(yīng)用注入DbContext (數(shù)據(jù)庫(kù)上下文服務(wù)),注入的上下文類型為 MyContext>
(options=>options.UseSqlite(“連接字符串”)
是 lambda 表達(dá)式,表示使用 sqlite 數(shù)據(jù)庫(kù),參數(shù)是連接字符串。Lambda 表達(dá)式屬于C# 基礎(chǔ)知識(shí),不會(huì)的話,先記著,以后查找資料。
來(lái)實(shí)際操作
請(qǐng)使用復(fù)制上面 方式一 的代碼,然后在Startup.cs類 --ConfigureServices 方法里加入
直接復(fù)制下面代碼覆蓋ConfigureServerices
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); string connecttext = "Filename=F:\\MY.DB"; services.AddDbContext<MyContext>(options => options.UseSqlite(connecttext)); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
注:
SQLite 數(shù)據(jù)庫(kù)文件,可以不加后綴名,但加上后綴名會(huì)便于別人識(shí)別這是一個(gè)數(shù)據(jù)庫(kù)的文件,后綴名不限,可以為 .DB、.SQLite、SQLite3等。
4 生成數(shù)據(jù)庫(kù)
點(diǎn)擊
工具
-NuGet 包管理器
--程序包管理器控制臺(tái)
輸入
Add-Migration InitialCreate
等待結(jié)束后在輸入
Update-Database
如圖
然后你會(huì)發(fā)現(xiàn)解決方案管理器,多了Migrations 目錄和一些文件,F(xiàn):\ 目錄也多了一個(gè)MY.DB文件
5 使用工具管理SQLite文件
生成數(shù)據(jù)庫(kù)文件后,會(huì)發(fā)現(xiàn)無(wú)法直接打開的,即使是 VS2017 也不行。
這時(shí)可以使用工具SQLite Expert Professional ,來(lái)對(duì) SQLIte 數(shù)據(jù)庫(kù)進(jìn)行管理。
下載地址http://www.dbjr.com.cn/database/265.html
軟件介紹http://www.dbjr.com.cn/database/265.html
安裝好軟件后,即可打開數(shù)據(jù)庫(kù)文件。
軟件打開數(shù)據(jù)庫(kù)文件教程:
6 生成增刪查改基架
這時(shí)候可以在程序?qū)?shù)據(jù)庫(kù)進(jìn)行操作,對(duì)于如何使用,最好去看微軟的Entity Framework文檔。
筆者這里給出一個(gè)簡(jiǎn)單的示例。
步驟 1
在 Controller 目錄,右鍵點(diǎn)擊 添加 -- 新建基架的項(xiàng)目
步驟 2
點(diǎn)擊 視圖使用 Entity Framework 的 MVC 控制器
模型類 選擇 Users([項(xiàng)目名稱].Models)
數(shù)據(jù)庫(kù)上下文選擇MyContext ([項(xiàng)目名稱].Models)
點(diǎn)擊 添加
步驟3
這時(shí)可以看到
Controller 多了 UsersController.cs 文件
Views 多了 Users 目錄
請(qǐng)點(diǎn)擊 運(yùn)行 或按 F5,啟動(dòng)網(wǎng)站
在網(wǎng)站后面加上Users
例如 https://localhost:[實(shí)際端口]/Users,就可以對(duì)Users表為所欲為了
步驟4 添加數(shù)據(jù)
點(diǎn)擊 Create new
結(jié)果
7 填寫數(shù)據(jù)不能為空
注:這里涉及到特性、數(shù)據(jù)驗(yàn)證,筆者不再贅述,讀者可以先了解,然后翻譯別的文章。
經(jīng)過(guò)上面操作,我們已經(jīng)可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,實(shí)際上,雖然可以操作數(shù)據(jù),可是如果我想設(shè)置某個(gè)項(xiàng)必須填寫呢,某個(gè)項(xiàng)的格式必須是手機(jī)呢?總不能讓用戶隨便填吧?
打開 Users.cs
添加引用
using System.ComponentModel.DataAnnotations;
修改Users類的代碼如下
public class Users { public int ID { get; set; } //主鍵 [Required] public string Name { get; set; } /n/用戶名稱 [Required(ErrorMessage ="不能為空")] public int Age { get; set; } //用戶年齡 [Required] [RegularExpression(@"^1[3458][0-9]{9}$", ErrorMessage = "手機(jī)號(hào)格式不正確")] public int Number { get; set; } //用戶手機(jī)號(hào)碼 }
運(yùn)行網(wǎng)站,打開 URL/Users,點(diǎn)擊 Create New,然后不用填寫內(nèi)容直接提交,會(huì)發(fā)現(xiàn)
填寫其它項(xiàng),然后在 Number一項(xiàng)亂填數(shù)字,會(huì)發(fā)現(xiàn)
這個(gè)就是模型驗(yàn)證。
它不需要寫什么代碼,只要在屬性上面加上 [特性]即可。
這方面知識(shí),請(qǐng)另外查閱。
注:
- [Required] 表示該項(xiàng)不能為空
- [Required(ErrorMessage ="不能為空")] ErrorMessage ="" 就是不按此要求填寫,會(huì)出現(xiàn)額提示
- [RegularExpression(@"^1[3458][0-9]{9}$", ErrorMessage = "手機(jī)號(hào)格式不正確")] 這是正則表達(dá)式驗(yàn)證,填寫的內(nèi)容不符合格式的話,會(huì)出現(xiàn)錯(cuò)誤提示。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- .net如何優(yōu)雅的使用EFCore實(shí)例詳解
- ASP.NET?Core?5.0中的Host.CreateDefaultBuilder執(zhí)行過(guò)程解析
- .Net Core中使用EFCore生成反向工程
- ASP.NET Core使用EF保存數(shù)據(jù)、級(jí)聯(lián)刪除和事務(wù)使用
- ASP.NET?Core使用EF查詢數(shù)據(jù)
- ASP.NET?Core使用EF創(chuàng)建模型(索引、備用鍵、繼承、支持字段)
- .net core實(shí)用技巧——將EF Core生成的SQL語(yǔ)句顯示在控制臺(tái)中
- 詳解.Net Core 權(quán)限驗(yàn)證與授權(quán)(AuthorizeFilter、ActionFilterAttribute)
- 在.NET Core類庫(kù)中使用EF Core遷移數(shù)據(jù)庫(kù)到SQL Server的方法
- .net連接oracle的3種實(shí)現(xiàn)方法
- C#利用ODP.net連接Oracle數(shù)據(jù)庫(kù)的操作方法
- .Net使用EF Core框架連接Oracle的方法
相關(guān)文章
asp.net利用反射實(shí)現(xiàn)給model類賦值的方法
這篇文章主要介紹了asp.net利用反射實(shí)現(xiàn)給model類賦值的方法,結(jié)合實(shí)例形式分析了asp.net使用反射給model類賦值的操作步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-03-03ASP.NET 頁(yè)面間數(shù)據(jù)傳遞方法小結(jié)
Web 頁(yè)面是無(wú)狀態(tài)的, 服務(wù)器對(duì)每一次請(qǐng)求都認(rèn)為來(lái)自不同用戶,因此,變量的狀態(tài)在連續(xù)對(duì)同一頁(yè)面的多次請(qǐng)求之間或在頁(yè)面跳轉(zhuǎn)時(shí)不會(huì)被保留。2009-12-12深入本機(jī)影像生成器(Ngen.exe)工具使用方法詳解
本篇文章是對(duì)本機(jī)影像生成器(Ngen.exe)工具使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05asp.net core下給網(wǎng)站做安全設(shè)置的方法詳解
這篇文章主要給大家介紹了關(guān)于asp.net core下給網(wǎng)站做安全設(shè)置的相關(guān)資料,文章通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07.NET 日志系統(tǒng)設(shè)計(jì)思路及實(shí)現(xiàn)代碼
這篇文章主要介紹了.NET 日志系統(tǒng)設(shè)計(jì)思路及實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-12-12.NET中可空值類型【Nullable<T>】實(shí)現(xiàn)原理
本文主要介紹了.NET中可空值類型的實(shí)現(xiàn)原理,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03asp.net 臟字典過(guò)濾問(wèn)題 用正則表達(dá)式來(lái)過(guò)濾臟數(shù)據(jù)
asp.net 臟字典過(guò)濾問(wèn)題 用正則表達(dá)式來(lái)過(guò)濾臟數(shù)據(jù)2009-10-10