使用EntityFramework6連接MySQL
不是微軟的親兒子這待遇就是不一樣,其中的坑可真實不少,第一次連MySQL足足折騰了我大半天。
廢話不多說直接開始。
安裝MySQL
從官網上下載最新版,下載好以后直接安裝就可以了。最新版的MySQL已經包含了所有開發需要的功能(包括MySQL連接器),相信會用MySQL,怎么裝應該都沒有問題,這里就不啰嗦了。不過有一點值得提醒的是,在選擇要安裝的內容時記得將所有功能都裝上,之后出現問題多半都是哪個模塊漏裝了。
安裝好之后,在開始菜單中找到MySQL Workbench,這是MySQL自帶的一款管理工具,個人也比較喜歡,一直用的也都是這個。以前要單獨安裝,不過現在自帶了。
創建數據庫
為了演示我先創建一個叫test的數據庫,並創建一張學生表Student
使用Entity Framework6 連接MySQL數據庫
准備工作都就緒了,接下來我創建一個項目來演示如何連接MySQL數據庫。
考慮到有些同學可能並不使用.NET MVC,所以這里我們創建一個控制台項目來演示。別擔心,在.NET MVC中,配置的過程都是完全一樣的。
一、添加EF包
打開NuGet包管理工具后,點擊瀏覽,然后搜索EntityFramework。先按裝EntityFramework,再安裝MySQL.Data.Entity.
通過NuGet來安裝EF可以幫我們省去很多麻煩的配置環節。
二、通過向導來連接MySQL數據庫
按照習慣,我先在項目中建立了一個Modules文件夾,用於保存所有生成的數據模型文件。之后右擊,新建項。
之后選擇ADO.NET實體數據模型,我取名為DBModel。
選擇來自數據庫的CodeFirst模型,點擊下一步。
PS:EF有三種方式來運行。
第一種是通過EF設計器,類似於傳統的數據庫設計器,通過畫出的數據結構圖來生成對應的類(數據模型)和數據庫,不過這種方式好像在EF7中將被廢棄掉了,所以不推薦使用。
第二種是通過先創建好數據庫,然后根據數據庫來生成對應的數據模型,這種方式稱之為數據庫優先DB Frist。
第三種是先手工編寫好需要的數據模型,然后根據數據模型逆向生成數據庫,這種方式稱之為代碼優先 Code First。
注意:不管你是習慣數據庫優先還是代碼優先。都請先用數據庫優先來生成代碼,這樣會省去很多中間配置的環節。
之后選擇新建連接
輸入你的數據庫地址(默認是localhost)和賬號、密碼,勾選保存密碼,在數據庫名稱中選擇你對應的數據庫,在這我的是test。完成后點擊測試連接,提示沒有問題后點擊確定。這一步如果出錯一般都是數據庫配置的問題,跟EF沒有關系。
選擇,是包含敏感信息
選擇你需要的數據庫和表,在這我選擇的是我之前在數據庫中創建的Student表。確定所生產對象名稱的單復數形式這個選項隨意。最開始我也沒理解到它的作用,其實就是英語的單復數,就是在名詞后面加S和不加S。
點擊完成之后如果你幸運的話,到這一步就成功了。不過事情一般沒那么簡單,傲嬌的EF就提示我什么主鍵值為空。
我第一次弄的時候這東西折磨了我大半天,什么辦法都試盡了,好在最后在Stack Overflow上找到了辦法。
打開MySQL管理器,執行
- use `test`; /*你的數據庫名*/
- set global optimizer_switch='derived_merge=OFF';
執行完之后再按照上面的步驟從頭一遍應該就可以了,如果還是不行就重啟一下MySQL服務,再執行一下上面的代碼,再試試。
三、分析生成的代碼
回到解決方案資源管理器,這時我們的項目下就應當多了兩個文件,一個是DBModel數據庫上下文(到時都是通過它來操作數據庫),一個是student數據模型。
打開DBModel.cs
student數據模型中對數據做了些描述(你不用代碼優先CodeFirst這些一般都不用管)
使用EF進行增刪改查
到這一步EF連接MySQL就已經完成了,之后你就可以像操作SQL Server一樣使用EF操作MySQL了。不過我還是演示下如何使用EF操作數據庫。
- class Program
- {
- static void Main(string[] args)
- {
- using (var db = new DBModel())
- {
- var student = (from t in db.students //查詢張三
- where t.name == "張三"
- select t).First();
- Console.WriteLine("張三的年齡是:" + student.age); //輸出:張三的年齡是:15
- db.students.Remove(student); //刪除張三
- //db.Entry(student).State = System.Data.Entity.EntityState.Deleted; //或者這樣刪除張三
- db.students.Add(new student { name = "小明", age = 21 }); //向數據庫中添加小明
- student = (from t in db.students //查詢李四
- where t.name == "李四"
- select t).First();
- student.age = 999; //更改李四的年齡
- //db.Database.ExecuteSqlCommand("delete from test.student where true"); //執行普通的SQL,刪除全部數據
- //var result = db.Database.SqlQuery<student>("select * from test.student"); //執行普通的SQL,查詢所有學生
- db.SaveChanges(); //保存結果
- }
- Console.Read();
- }
- }