到目前爲止,本身學到的連接數據庫操做已經經歷了幾個階段,分別是:學生信息管理和(第一次)機房收費時的直接鏈接數據庫操做表格,而後是機房我的重構中應用的操做實體,在其中還利用了一個很重要的幫助類:SQLHelper。程序員
在這個轉變中,已經逐步由面向過程轉向面向對象,但在分層操做實體的過程當中,因爲數據庫的設計不很完美,有時候須要修改數據庫設計,或者須要更改實體。每次遇到這樣的事兒,就腦殼疼,由於數據庫和實體必需要對應起來,否則問題就越改越大了。首先,回顧一下這以前的數據庫連接操做。也就是運用ADO.NET進行操做,主要經歷5個步驟:創建鏈接—打開—建立命令—執行—關閉。如:sql
<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;"> private void button1_Click(object sender, EventArgs e) { string conStr = @"server=.;uid=sa;pwd=123456;database=shoppingBus";//鏈接字符串 SqlConnection sqlconnection = new SqlConnection(conStr);//創建鏈接 sqlconnection.Open();//打開連接 string str = "select * from petType"; DataTable dt = new DataTable(); SqlDataAdapter sqldataadapter = new SqlDataAdapter(str,sqlconnection);//執行命令,讀取數據 sqldataadapter.Fill(dt);//填充表格 this.dataGridView1.DataSource = dt; sqlconnection.Close();//關閉連接 }</span></span>
實體框架(Entity Framework)是微軟以ADO.Net爲基礎開發出來的對象關係映射(ORM)解決方案,它解決了對象持久化問題,將程序員從編寫麻煩的SQL語句當中解放出來。 相對於傳統的ADO等各類數據庫操縱技術來講,微軟的ADO.Net更爲先進,它封裝了不少底層操做,抽象了接口,針對接口編程,將調用統一化。
數據庫
我認爲實體框架的好處是,當咱們須要修改數據庫或者實體時,可以經過實體模型的及時更新解決實體對應映射問題,而不用像以前同樣一個一個的對照着修改。並且,它的跨數據庫應用實踐更爲方便,只須要更改配置文件中的數據便可,能夠直接將模型生成應用程序數據庫到對應數據庫服務中。編程
首先,實在VS中創建新項,添加新建項—數據—ADO.NET實體數據模型,而後設置其本身想要的映射的數據集,設置成功後,會生成一些列文件:設計模式
如上圖所示,這就是我測試用的shoppingBus數據庫生成的實體映射。其中有3個重要的類,分別是:框架
dataModel.Context.tt下的dataModel.Context.cs類,這個類是包含的數據庫的上下文關係,我當時在看的時候就想到了設計模式策略模式中的context類,我認爲它們有着共同之處,都是負責數據間的交互和實現。數據庫設計
DataModel.tt下的數據表類,好比這裏的就是pet.cs類和petType.cs類。這裏就是至關於具體的實體類,值得特別說明的是,EF生成的實體映射同時包括表關係,主外鍵的關係等。ide
<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;"> static void Main(string[] args) { //第一步:建立EF訪問數據庫的統一入門,上下文:DbContext shoppingBusEntities1 dbcontext = new shoppingBusEntities1(); #region 增、刪、改 //第二步:插入一條數據,添加一個寵物類型 pet pet = new pet(); pet.petID = "003"; pet.petName = "人"; pet.petPrice = 19; //第三步:修改數據,設置狀態 dbcontext.Entry<pet>(pet).State = EntityState.Modified;//增、刪、改,直接修改實體的狀態便可 #endregion #region 查詢 var temps = from p in dbcontext.pet where p.petID == "001" select p;//查詢所有列 //select p.petName;//查詢部分列 foreach (var myPet in temps) { Console.WriteLine(myPet.petID + " " + myPet.petName +" "+myPet.petPrice); } #endregion //第四步:命令把全部的變化都更新到數據庫裏面去 dbcontext.SaveChanges(); }</span></span>
說明:向原來用的SQL連接數據庫操做數據同樣,EF實體也有本身的邏輯步驟,則是:創建訪問入口(上下文)—整理本身的數據—告訴上下文須要執行的操做—保存本身的操做。能夠看到,尤爲是在增、刪、改的過程當中,沒有看見任何的SQL語句,但實際上是由編譯器先幫咱們翻譯成了SQL的腳本。因此,使用EF操做數據庫和使用以前的方法操做數據庫,主要的區別則是在轉換腳本這一過程當中的不一樣,EF須要轉換,而以前的方法不須要。學習
根據本身目前的理解,我以爲EF實體映射其實已經脫離了對數據庫的一個操做。咱們操做的應該是實體,而後經過實體映射給數據庫。因此是進一步和數據庫解耦和了,達到了一個真正的面向對象。測試
而使用EF實體還有好處就是,能夠動態的更新實體和數據庫的映射關係,從而就不用向原來同樣費神費力的去兩邊對照修改。能夠由數據庫端更新,而後直接更新實體映射,也能夠是更改實體映射,而後更新數據庫。因爲EF實體操做並不直接操做數據庫,因此它在跨數據庫操做方面(更改配置文件中的provider的提供方式),也有着本身的優點。