.Net Core建站(2):EF Core+CodeFirst数据库迁移
上一篇的話,說(shuō)了下怎么使用EF7 實(shí)現(xiàn) CodeFirst去生成數(shù)據(jù)庫(kù),
其實(shí)還有好多問(wèn)題的,這次一點(diǎn)一點(diǎn)的解決吧,都挺簡(jiǎn)單,不過(guò)零零散散的,,
1.讀取配置文件,獲得鏈接字符串
2.使用數(shù)據(jù)庫(kù)進(jìn)行增刪查改
3.實(shí)體類(lèi)更新后,數(shù)據(jù)庫(kù)也更新
?
一、讀取配置文件,獲得鏈接字符串
上一篇我們的鏈接字符串是這樣寫(xiě)的
直接寫(xiě)在程序里面是非常非常不好的行為,所以我很簡(jiǎn)單粗暴的丟到appsettings.json這個(gè)配置文件里面去了,,
1 { 2 "Logging": { 3 "IncludeScopes": true, 4 "LogLevel": { 5 "Default": "Warning" 6 } 7 }, 8 "ConStr": "server=.;Database=DBCodeFirst;uid=sa;pwd=12346" 9 }接下來(lái),要愁的是怎么把配置讀出來(lái),而且,既然是配置文件,肯定整個(gè)項(xiàng)目都要用上,肯定是要封裝起來(lái)的,
網(wǎng)上也找了很多啊,各種各樣的, 有些大佬還可以直接讀取成一個(gè)對(duì)象,這里我不搞那些騷操作啊,,,emmm,不會(huì)告訴你們我看不懂的
走最簡(jiǎn)單的,鍵值對(duì),就像以前讀取webconfig文件一樣,
首先需要引用三個(gè)包,直接右鍵編輯commom.csproj:
1 <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" /> 2 <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" /> 3 <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" />然后新建一個(gè)類(lèi)Config:
1 using Microsoft.Extensions.Configuration; 2 using Microsoft.Extensions.DependencyInjection; 3 using Microsoft.Extensions.Options; 4 using System; 5 using System.Diagnostics; 6 7 namespace Common 8 { 9 /// <summary> 10 /// 配置類(lèi) 11 /// </summary> 12 public class Config 13 { 14 /// <summary> 15 /// 所有的配置數(shù)據(jù) 16 /// </summary> 17 private static IConfigurationRoot Configuration { get; set; } 18 19 /// <summary> 20 /// 獲得數(shù)據(jù) 21 /// </summary> 22 /// <param name="_Configuration"></param> 23 public static void SetConfig(IConfigurationRoot _Configuration) 24 { 25 Configuration = _Configuration; 26 } 27 28 /// <summary> 29 /// 返回對(duì)應(yīng)鍵的值 30 /// </summary> 31 /// <typeparam name="T"></typeparam> 32 /// <param name="key">鍵</param> 33 /// <param name="def">默認(rèn)值</param> 34 /// <returns></returns> 35 public static T GetVal<T>(string key, T def = default(T)) 36 { 37 try 38 { 39 def = (T)Convert.ChangeType(Configuration.GetSection(key).Value, typeof(T)); 40 } 41 catch (Exception e) 42 { 43 Debug.WriteLine(e.Message); 44 } 45 return def; 46 } 47 48 } 49 50 }然后還要進(jìn)行一下配置,在Startup.cs文件的Startup方法改造一下:
1 public Startup(IConfiguration configuration) 2 { 3 IConfigurationRoot config = new ConfigurationBuilder() 4 .SetBasePath(Directory.GetCurrentDirectory()) 5 .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 6 .Build(); 7 8 Config.SetConfig(config); 9 }使用方法很簡(jiǎn)單的,一句話就好:
1 // 數(shù)據(jù)庫(kù)連接字符串 2 string conStr = Config.GetVal<string>("ConStr");因?yàn)楝F(xiàn)在的配置文件是json格式,所以,層級(jí)結(jié)構(gòu)是肯定會(huì)有的,比如說(shuō),我現(xiàn)在要讀取Logging下的IncludeScopes值,可以這樣寫(xiě):
1 string IncludeScopes = Config.GetVal<string>("Logging:IncludeScopes");以此類(lèi)推,,,這樣肯定沒(méi)其他大佬們直接讀取成對(duì)象來(lái)得快,不過(guò)好在簡(jiǎn)單易懂,以后等我學(xué)會(huì)了那種高大上的方法再來(lái)分享,,現(xiàn)在先就醬紫用著,,
二、使用數(shù)據(jù)庫(kù)進(jìn)行增刪查改
這一段主要是吐槽,,
以前我們使用EF,不管是DBFirst還是CodeFirst,亦或者M(jìn)odelFirst,要使用數(shù)據(jù)庫(kù)都是很簡(jiǎn)單粗暴的new一個(gè)上下文對(duì)象
1 // 數(shù)據(jù)庫(kù)上下文 2 var DB=new DBCodeFirst();然鵝!!!!!!!當(dāng)我用CodeFirst把數(shù)據(jù)庫(kù)生成以后,喜滋滋的跑過(guò)去加一條測(cè)試數(shù)據(jù),
1 public IActionResult Index() 2 { 3 DBCodeFirst db = new DBCodeFirst(); 4 db.DT_User.Add(new DT_User { UserName = "嘿嘿" }); 5 var count = db.SaveChanges();7 return View(); 8 9 }他丫的給我報(bào)錯(cuò),,,
翻譯過(guò)來(lái)就是這個(gè),,
沒(méi)有數(shù)據(jù)庫(kù)提供商已為這個(gè)DbContext。一個(gè)供應(yīng)商可以通過(guò)重寫(xiě)dbcontext.onconfiguring方法或使用adddbcontext對(duì)應(yīng)用服務(wù)提供商配置。
如果adddbcontext使用,并確保你的DbContext類(lèi)型構(gòu)造函數(shù)接受dbcontextoptions < tcontext >對(duì)象并將其傳遞給DbContext基構(gòu)造函數(shù)。”
?反正我是沒(méi)看懂的,,,永遠(yuǎn)不知道當(dāng)時(shí)我的心情是多么的難受,
又是一陣百度啊,可算是被我找到解決方法了,,,得這樣寫(xiě):
講真,我還沒(méi)接觸到依賴(lài)注入,所以這段代碼看的是有點(diǎn)懵逼的,
好像關(guān)聯(lián)的是Startup這個(gè)類(lèi)里面的ConfigureServices方法,哪位大佬有興致的話可以給我留言講講,感激不盡
不過(guò)好歹是可以用數(shù)據(jù)庫(kù)了,,下一步是搭一個(gè)三層,,一籌莫展ing,,,
以前是可以直接new上下文,現(xiàn)在不行了,還不知道這個(gè)依賴(lài)注入能不能在其他層使用,,
等我把三層整出來(lái)之后,再寫(xiě)出來(lái)分享吧,,估計(jì)是下一篇了
三.實(shí)體類(lèi)更新后,數(shù)據(jù)庫(kù)也更新
這個(gè)的話首先回顧上一篇啊,
在上一篇里面用了兩個(gè)命令來(lái)生成數(shù)據(jù)庫(kù)(DBLog我改成Init了,,這個(gè)隨意,,)
Add-Migration Init 和 Update-DataBase Init如果在上下文中加了實(shí)體類(lèi)或者修改了實(shí)體類(lèi)字段,我們肯定是要更新數(shù)據(jù)庫(kù)的,
這個(gè)時(shí)候,我們?cè)?span style="color:#ff0000;">已經(jīng)生成數(shù)據(jù)庫(kù)和Migrations文件夾的前提下,繼續(xù)使用上面的兩個(gè)命令
不過(guò)這個(gè)時(shí)候要稍稍改動(dòng):
Add-Migration UpData 和 Update-DataBase UpData記得每次使用的時(shí)候,最后一個(gè)參數(shù)名稱(chēng)千萬(wàn)不能一樣
就像我第一次使用的名稱(chēng)是Init?第一次更新數(shù)據(jù)庫(kù)的時(shí)候,使用的是UpData
以后肯定還會(huì)有更多的更新,每次都不能一樣,比如:UpData01、UpData02、UpData03、...
同時(shí)Migrations文檔會(huì)對(duì)應(yīng)的增加內(nèi)容
數(shù)據(jù)庫(kù)自動(dòng)生成的__EFMigrationsHistory表中也會(huì)有我們的數(shù)據(jù)庫(kù)遷移記錄
emmm,差不多就這些吧,,,
我還得想辦法把三層整出來(lái),,,,臉滾鍵盤(pán).gif
?
轉(zhuǎn)載于:https://www.cnblogs.com/Onlooker/p/8097588.html
總結(jié)
以上是生活随笔為你收集整理的.Net Core建站(2):EF Core+CodeFirst数据库迁移的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu如何安装deb文件? ubu
- 下一篇: WPF绘制光滑连续贝塞尔曲线