一. 簡介
EF連接數據庫有三種模式,分別是DBFirst、ModelFirst、CodeFirst,分別適用於不同的開發場景。
該章節,將主要介紹EF的DBFirst連接SQLServer數據庫和MySql數據庫兩種操作方式
該模式在EF中出現的出現的最早,符合我們的傳統開發模式,先設計數據庫→然后在代碼通過EF與數據庫建立映射關系,是EF最早的一種使用方式,使用廣泛.以數據庫為驅動,生成實體模型,從而驅動整個開發流程。
(1). 優點:操作簡單,直接通過可視化界面與數據庫表(存儲過程、視圖等)建立映射關系,省去自己建立表實體的繁瑣步驟.
(2). 缺點:與表依賴太強,而且實體是通過T4模板生成的,無法自己根據實際需要來修改,並且一旦數據庫修改,就需要重新映射edmx文件了.
(3). 特點:通過T4模板來生成EF上下文和實體模型; 並且可以直接將存儲過程或視圖映射到生成的上下文中,通過EF上下文直接調用存儲過程(詳見 EF調用存儲過程章節)
二. DBFirst連接SQLServer數據庫
1. 選擇ADO.NET數據實體模型
2. 選擇模型內容:來自數據庫的EF設計器
3. 設置服務器及連接字符串
4. 選擇數據庫的連接並且可以設置配置文件的名稱
5. 選擇要映射的表、視圖、存儲過程和函數,完成映射
6. 如果框架是分層的,需要將生產的連接數據庫的字符串,復制到主程序的配置文件中
三. DBFirst連接MySQL數據庫
事先准備和注意事項:
步驟:
①:安裝mysql-connector-net-6.9.9.msi,下載地址:https://dev.mysql.com/downloads/connector/net/ (vs2012-vs2017通用)
②:安裝mysql-for-visualstudio-1.2.7.msi,下載地址:https://dev.mysql.com/downloads/windows/visualstudio/ (vs2012-vs2017通用)
③:連接遠程服務器需要先在對應數據庫服務器上對訪問外來的ip和用戶名、密碼進行授權。
如:GRANT ALL PRIVILEGES ON *.* TO 'root'@'39.88.192.171' IDENTIFIED BY '123456' WITH GRANT OPTION;
表示:ip為39.88.192.171的root用戶、密碼為123456可以遠程訪問該數據庫服務器
④:安裝常規的DBFist模式進行連接即可,但連接界面要選擇MySQL對應的界面。
特別注意:在使用該模式的時候,會遇到這么幾個煩人的情況,如果該項目中已經引用的了EF的程序集,在可視化界面無法選擇EF版本。
但是如果你把引用的程序集刪了,可視化界面只能選擇EF5.0
所以解決方案:
步驟①:如果引用了EF的程序集,先刪掉,然后用可視化界面把EF5.0添加進來,然后在使用Nuget把EF5.0卸載掉。
步驟②:通過nuget一次添加 EF6.x、MySql.Data、MySql.Data.Entity、MySql.Web 程序集的引用.
步驟③:如果是分層開發,不但要向封裝層添加引用,還要想主程序層添加EF6.x、MySql.Data、MySql.Data.Entity、MySql.Web 程序集的引用.
步驟④:主程序層配置文件中<entityFramework>→<providers>節點下添加:
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"></provider>
如果是通過Nuget添加的程序集,檢查一下是否已經自動添加了,避免重復添加的情況
鏈接步驟:使用MySQL的客戶端界面
代碼測試,和SQLServer寫法並沒有什么兩樣
1 private static void NewMethod() 2 { 3 Console.WriteLine("-----------------------1. DBFirst模式連接MySQL數據庫-------------------------------"); 4 using (DbContext db = new mysqldb1Entities()) 5 { 6 //1.1 測試查詢 (正常) 7 //List<tbb1> tList = db.Set<tbb1>().ToList(); 8 //foreach (var item in tList) 9 //{ 10 // Console.WriteLine("id為:{0},name為:{1}", item.id, item.name); 11 //} 12 13 //1.2 測試一下大數據 (正常) 14 Stopwatch watch = Stopwatch.StartNew(); 15 List<tbb1> tList2 = new List<tbb1>(); 16 for (int i = 0; i < 1000; i++) 17 { 18 tbb1 t = new tbb1(); 19 t.id = Guid.NewGuid().ToString("N"); 20 t.name = "t" + i; 21 tList2.Add(t); 22 } 23 db.BulkInsert(tList2); 24 watch.Stop(); 25 Console.WriteLine("{0}條數據耗時:{1}", 1000, watch.ElapsedMilliseconds); 26 } 27 } 28 #endregion