上一篇的話,說了下怎麼使用EF7 實現 CodeFirst去生成數據庫,html
其實還有好多問題的,此次一點一點的解決吧,都挺簡單,不過零零散散的,,web
1.讀取配置文件,得到連接字符串數據庫
2.使用數據庫進行增刪查改json
3.實體類更新後,數據庫也更新app
上一篇咱們的連接字符串是這樣寫的函數
直接寫在程序裏面是很是很是很差的行爲,因此我很簡單粗暴的丟到appsettings.json這個配置文件裏面去了,,測試
1 { 2 "Logging": { 3 "IncludeScopes": true, 4 "LogLevel": { 5 "Default": "Warning" 6 } 7 }, 8 "ConStr": "server=.;Database=DBCodeFirst;uid=sa;pwd=12346" 9 }
接下來,要愁的是怎麼把配置讀出來,並且,既然是配置文件,確定整個項目都要用上,確定是要封裝起來的,ui
網上也找了不少啊,各類各樣的, 有些大佬還能夠直接讀取成一個對象,這裏我不搞那些騷操做啊,,,emmm,不會告訴大家我看不懂的spa
走最簡單的,鍵值對,就像之前讀取webconfig文件同樣,翻譯
首先須要引用三個包,直接右鍵編輯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" />
而後新建一個類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 /// 配置類 11 /// </summary> 12 public class Config 13 { 14 /// <summary> 15 /// 全部的配置數據 16 /// </summary> 17 private static IConfigurationRoot Configuration { get; set; } 18 19 /// <summary> 20 /// 得到數據 21 /// </summary> 22 /// <param name="_Configuration"></param> 23 public static void SetConfig(IConfigurationRoot _Configuration) 24 { 25 Configuration = _Configuration; 26 } 27 28 /// <summary> 29 /// 返回對應鍵的值 30 /// </summary> 31 /// <typeparam name="T"></typeparam> 32 /// <param name="key">鍵</param> 33 /// <param name="def">默認值</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 }
而後還要進行一下配置,在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 }
使用方法很簡單的,一句話就好:
1 // 數據庫鏈接字符串 2 string conStr = Config.GetVal<string>("ConStr");
由於如今的配置文件是json格式,因此,層級結構是確定會有的,好比說,我如今要讀取Logging下的IncludeScopes值,能夠這樣寫:
1 string IncludeScopes = Config.GetVal<string>("Logging:IncludeScopes");
以此類推,,,這樣確定沒其餘大佬們直接讀取成對象來得快,不過好在簡單易懂,之後等我學會了那種高大上的方法再來分享,,如今先就醬紫用着,,
這一段主要是吐槽,,
之前咱們使用EF,不論是DBFirst仍是CodeFirst,亦或者ModelFirst,要使用數據庫都是很簡單粗暴的new一個上下文對象
1 // 數據庫上下文 2 var DB=new DBCodeFirst();
然鵝!!!!!!!當我用CodeFirst把數據庫生成之後,喜滋滋的跑過去加一條測試數據,
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 }
他丫的給我報錯,,,
翻譯過來就是這個,,
沒有數據庫提供商已爲這個DbContext。
一個供應商能夠經過重寫dbcontext.onconfiguring方法或使用adddbcontext對應用服務提供商配置。
若是adddbcontext使用,並確保你的DbContext類型構造函數接受dbcontextoptions < tcontext >對象並將其傳遞給DbContext基構造函數。」
反正我是沒看懂的,,,永遠不知道當時個人心情是多麼的難受,
又是一陣百度啊,可算是被我找到解決方法了,,,得這樣寫:
講真,我還沒接觸到依賴注入,因此這段代碼看的是有點懵逼的,
好像關聯的是Startup這個類裏面的ConfigureServices方法,哪位大佬有興致的話能夠給我留言講講,感激涕零
不過好歹是能夠用數據庫了,,下一步是搭一個三層,,束手無策ing,,,
之前是能夠直接new上下文,如今不行了,還不知道這個依賴注入能不能在其餘層使用,,
等我把三層整出來以後,再寫出來分享吧,,估計是下一篇了
這個的話首先回顧上一篇啊,
在上一篇裏面用了兩個命令來生成數據庫(DBLog我改爲Init了,,這個隨意,,)
Add-Migration Init 和 Update-DataBase Init
若是在上下文中加了實體類或者修改了實體類字段,咱們確定是要更新數據庫的,
這個時候,咱們在已經生成數據庫和Migrations文件夾的前提下,繼續使用上面的兩個命令
不過這個時候要稍稍改動:
Add-Migration UpData
和
Update-DataBase UpData
記得每次使用的時候,最後一個參數名稱千萬不能同樣
就像我第一次使用的名稱是Init 第一次更新數據庫的時候,使用的是UpData
之後確定還會有更多的更新,每次都不能同樣,好比:UpData0一、UpData0二、UpData0三、...
同時Migrations文檔會對應的增長內容
數據庫自動生成的__EFMigrationsHistory表中也會有咱們的數據庫遷移記錄
emmm,差很少就這些吧,,,
我還得想辦法把三層整出來,,,,臉滾鍵盤.gif