1. 程式人生 > >使用.Net Core+EF7 CodeFirst(2)

使用.Net Core+EF7 CodeFirst(2)

desc stat 記得 server pri new debug pos tco

上一篇的話,說了下怎麽使用EF7 實現 CodeFirst去生成數據庫,

其實還有好多問題的,這次一點一點的解決吧,都挺簡單,不過零零散散的,,

1.讀取配置文件,獲得鏈接字符串

2.使用數據庫進行增刪查改

3.實體類更新後,數據庫也更新

一、讀取配置文件,獲得鏈接字符串

上一篇我們的鏈接字符串是這樣寫的

技術分享圖片

直接寫在程序裏面是非常非常不好的行為,所以我很簡單粗暴的丟到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 }

接下來,要愁的是怎麽把配置讀出來,而且,既然是配置文件,肯定整個項目都要用上,肯定是要封裝起來的,

網上也找了很多啊,各種各樣的, 有些大佬還可以直接讀取成一個對象,這裏我不搞那些騷操作啊,,,emmm,不會告訴你們我看不懂的

走最簡單的,鍵值對,就像以前讀取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

以後肯定還會有更多的更新,每次都不能一樣,比如:UpData01、UpData02、UpData03、...

同時Migrations文檔會對應的增加內容

技術分享圖片

數據庫自動生成的__EFMigrationsHistory表中也會有我們的數據庫遷移記錄

技術分享圖片

emmm,差不多就這些吧,,,

我還得想辦法把三層整出來,,,,臉滾鍵盤.gif

使用.Net Core+EF7 CodeFirst(2)