使用EntityFramework6鏈接MySQL
不是微軟的親兒子這待遇就是不同,其中的坑可真實很多,第一次連MySQL足足折騰了我大半天。html
廢話很少說直接開始。mysql
安裝MySQL
從官網上下載最新版,下載好之後直接安裝就能夠了。最新版的MySQL已經包含了全部開發須要的功能(包括MySQL鏈接器),相信會用MySQL,怎麼裝應該都沒有問題,這裏就不囉嗦了。不過有一點值得提醒的是,在選擇要安裝的內容時記得將全部功能都裝上,以後出現問題多半都是哪一個模塊漏裝了。sql
安裝好以後,在開始菜單中找到MySQL Workbench,這是MySQL自帶的一款管理工具,我的也比較喜歡,一直用的也都是這個。之前要單獨安裝,不過如今自帶了。數據庫
建立數據庫
爲了演示我先建立一個叫test的數據庫,並建立一張學生表Student數據結構
使用Entity Framework6 鏈接MySQL數據庫
準備工做都就緒了,接下來我建立一個項目來演示如何鏈接MySQL數據庫。數據庫設計
考慮到有些同窗可能並不使用.NET MVC,因此這裏咱們建立一個控制檯項目來演示。別擔憂,在.NET MVC中,配置的過程都是徹底同樣的。工具
1、添加EF包
打開NuGet包管理工具後,點擊瀏覽,而後搜索EntityFramework。先按裝EntityFramework,再安裝MySQL.Data.Entity.測試
經過NuGet來安裝EF能夠幫咱們省去不少麻煩的配置環節。spa
2、經過嚮導來鏈接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服務,再執行一下上面的代碼,再試試。
3、分析生成的代碼
回到解決方案資源管理器,這時咱們的項目下就應當多了兩個文件,一個是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();
- }
- }