乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      靈動思緒EF(Entity FrameWork)

       ThinkTank_引擎 2014-04-07

        很久之前就想寫這篇文章了,但是由于種種原因,沒有將自己學(xué)習(xí)的EF知識整理成一片文章。今天我就用CodeFirst和ModelFirst兩種方式的簡單案例將自己學(xué)習(xí)的EF知識做個總結(jié)。

        在講解EF之前,我們先來看下ORM

        ORM全稱:(Object-Relation  Mapping)即對象-關(guān)系映射。ORM是將關(guān)系數(shù)據(jù)庫中的業(yè)務(wù)數(shù)據(jù)用對象的形式表現(xiàn)出來,并通過面向?qū)ο蟮姆绞綄⑦@些對象組織起來,實現(xiàn)系統(tǒng)業(yè)務(wù)邏輯的過程。

        ORM簡介:

        ORM產(chǎn)生背景:

        1、操作數(shù)據(jù)庫代碼的重復(fù)性

        在ORM之前我們知道通過ADO.NET可以訪問數(shù)據(jù)庫?;蛘吒M(jìn)一步,學(xué)過三層架構(gòu)的開發(fā)人員,知道可以將通過ADO.NET對數(shù)據(jù)庫的操作提取到一個單獨的類SqlHelper中,然后在DAL層調(diào)用SqlHelper類的方法實現(xiàn)對數(shù)據(jù)庫的操作。即使你這樣做了,在數(shù)據(jù)訪問層(DAL)層,還是要寫大量的代碼,而且我們都知道對數(shù)據(jù)庫的訪問無非增、刪、改、查四種操作,那么我們很容易想到我們做了大量的重復(fù)性工作。只是因為操作的表不同,我們可能需要花費大量的時間編寫針對該表的增刪改查語句,那么有沒有一種方式能自動生成這些語句呢?這樣的話,我們就可以吧主要的精力或者更多的時間投入到特殊業(yè)務(wù)的處理上。

        2、大量SQL語句影響程序的擴(kuò)展性和靈活性

        我們知道之前我們編寫的程序和數(shù)據(jù)庫之間的耦合性很緊密,如果我們操作的是SQL Server數(shù)據(jù)庫,我們就需要引入對應(yīng)的類庫(SqlConnection等),這樣如果需要更換數(shù)據(jù)庫,那么,數(shù)據(jù)訪問層的代碼就需要重新書寫。

        ORM含義:

        通過該圖,我們可以看出,O對應(yīng)程序中的類Customer,就是對象,我們知道R含義為Relation,對應(yīng)數(shù)據(jù)當(dāng)中的關(guān)系表;M表示程序中對象和數(shù)據(jù)庫中關(guān)系表的映射關(guān)系。Mapping實際上是一個XML文件

        接著我們再來看下面這張圖

        通過該圖,我們可以看出業(yè)務(wù)實體,在數(shù)據(jù)庫中表現(xiàn)為關(guān)系數(shù)據(jù),而在內(nèi)存中表現(xiàn)為對象。應(yīng)用程序處理對象很容易,但是很難處理關(guān)系數(shù)據(jù)。ORM做到了關(guān)系數(shù)據(jù)和對象數(shù)據(jù)之間的映射,ORM可以通過映射關(guān)系自動產(chǎn)生SQL語句,ORM在業(yè)務(wù)邏輯層和數(shù)據(jù)層之間充當(dāng)橋梁。

        ORM核心原則:

        1、簡單性

        2、傳達(dá)性

        3、精確性

        ORM優(yōu)點:

        1、面向?qū)ο?/p>

        不用編碼,就可以向操作對象一樣操作數(shù)據(jù)庫

        2、提高開發(fā)效率

        ORM可以自動對實體對象與數(shù)據(jù)庫中表進(jìn)行字段與屬性的映射,不需要單獨的數(shù)據(jù)訪問層就可以對數(shù)據(jù)進(jìn)行增刪改查。

        3、方便轉(zhuǎn)移數(shù)據(jù)庫

        當(dāng)數(shù)據(jù)庫發(fā)生改變時,不需要對模型進(jìn)行改動,只需要修改映射關(guān)系就可以 了。

        ORM缺點:

        1、不夠靈活,對于復(fù)雜查詢,ORM力不從心。

        2、執(zhí)行效率低于直接 編寫的SQL語句 。

        3、性能損耗,ORM中的映射和關(guān)系管理是以犧牲性能為代價的

        4、提高了學(xué)習(xí)成本。

        ORM使用場合:

        1、對性能要求不是很苛刻的程序

          有一個轉(zhuǎn)換的成本

        2、開發(fā)時間緊迫時

        3、有數(shù)據(jù)庫遷移需求時

        常見ORM框架

        ORM不是產(chǎn)品,是框架的總稱,面向?qū)ο蟮某绦蛟O(shè)計語言到關(guān)系數(shù)據(jù)庫的映射。

        使程序員既可以利用面向?qū)ο笳Z言的簡單易用性,又可以利用關(guān)系數(shù)據(jù)庫的技術(shù)優(yōu)勢來實現(xiàn)應(yīng)用程序的增刪改查操作。

        1、NHibernate:Hibernate在.NET平臺下的版本

        2、iBatis.NET:iBatis在.NET平臺的實現(xiàn)

        3、Linq to SQL(微軟不再更新):.NET針對SQL server的ORM框架

        4、ADO.NET  Entity  Framework:微軟在.NET4.0推出的領(lǐng)域驅(qū)動開發(fā)模型。

        注意:ADO.NET  Entity  Framework是微軟以ADO.NET為基礎(chǔ)所發(fā)展出來的對象關(guān)系映射解決方案,只不過是對ADO.NET進(jìn)行了一個更高層次的封裝。

        .NET應(yīng)用程序訪問數(shù)據(jù)庫的方式

        1、手寫代碼通過ADO.NET類庫

        2、DataSet結(jié)合DataAdapter結(jié)合

        3、ORM

        ORM解決方案:

        Linq to sql

        EF:數(shù)據(jù)庫的ER模型可以完全轉(zhuǎn)換成對象模型

        EF體系結(jié)構(gòu)

        1、Data Providers:數(shù)據(jù)庫的相關(guān)操作

        2、EDM:概念層和邏輯層的映射,應(yīng)用程序構(gòu)建在該層之上

        3、其他層:如何操作EDM

        接下來,我們來看下EDM的概念

        EDM(Entity  Data   Model):實體數(shù)據(jù)模型

        能將我們對數(shù)據(jù)對象的操作為對數(shù)據(jù)庫的操作。

        在EF中,我們對數(shù)據(jù)對象的操作,實際上是在操作EDM,

        EDM會將對數(shù)據(jù)對象的操作發(fā)送到數(shù)據(jù)庫。

        EDM三層:

        CSDL(概念層)

        定義對象模型,以面向?qū)ο蟮姆绞皆L問數(shù)據(jù),可以簡單理解為實體類

        MSL(對應(yīng)層)

        負(fù)責(zé)上層的概念層結(jié)構(gòu)與下層的存儲結(jié)構(gòu)之間的映射

        SSDL(存儲層)

        負(fù)責(zé)與數(shù)據(jù)庫管理系統(tǒng)中的數(shù)據(jù)表做實體對應(yīng)

        EF圖解:

        當(dāng)我們通過應(yīng)用程序?qū)?shù)據(jù)庫執(zhí)行CRUD時,通過EF方式,實際上是對ObjectContext的操作,ObjectContext相當(dāng)于EF的入口,ObjectContext拿到對應(yīng)的消息(CRUD)后,通過ORM中的Mapping來將對象O映射成數(shù)據(jù)庫中的關(guān)系R。我們通過一個截圖來看下Mapping中存儲的內(nèi)容。

        然后我們就來通過CodeFirst的方式實現(xiàn)對數(shù)據(jù)庫的增刪改查操作。

        CodeFirst方式

        首先我們新建一個windows應(yīng)用程序,然后對項目點擊右鍵,添加新建項,如下圖

        然后點擊添加按鈕,

        點擊下一步,

        點擊新建連接

        然后點擊確定按鈕,然后點擊下一步,

        選中表節(jié)點,然后點擊完成即可。

        然后打開項目中的edmx下的Designer.cs文件:

        打開上下文節(jié)點:

        ObjectContext前的類名就是我們所說的上下文。

        那么下面我們開始編寫代碼:

      /*  注意點:數(shù)據(jù)庫中的表必須有主鍵,如果是模型先行,則模型也c必須有主鍵。*/
      private void Form1_Load(object sender, EventArgs e)
      {
          // 實現(xiàn)EF第一種方式:CodeFirst:代碼先行機(jī)制
          /************************ 增加數(shù)據(jù)***********************/
          //01.創(chuàng)建EF上下文實例
          EFFirstEntities efFirst = new EFFirstEntities();
          #region 新增數(shù)據(jù)
          ////02.構(gòu)造出一個實體
          //Student stu = new Student();
          //stu.Name = "張三";
          ////03.將實體對象添加到實體集合中
          //efFirst.Student.AddObject(stu);
          ////04.最后要告訴EM幫我去將數(shù)據(jù)保存到數(shù)據(jù)庫
          //efFirst.SaveChanges();
          #endregion
         /*************************修改數(shù)據(jù)************************/
         //02.構(gòu)造出你要修改的實體
          #region 修改數(shù)據(jù)
          //Student stu = new Student();
          //stu.Name = "李四";
          //stu.ID = 4;
          ////03.將當(dāng)前實體用EF進(jìn)行跟蹤
          //efFirst.Student.Attach(stu);
          ////04.將狀態(tài)設(shè)置為Modified
          //efFirst.ObjectStateManager.ChangeObjectState(stu, EntityState.Modified);
          ////05.保存
          //efFirst.SaveChanges();
          #endregion  
          /***********************刪除數(shù)據(jù)*************************/
          #region 刪除
          //Student stu = new Student();
          //stu.ID = 4;
          ////03.也是要跟蹤當(dāng)前的實體對象
          //efFirst.Student.Attach(stu);
          //efFirst.ObjectStateManager.ChangeObjectState(stu, EntityState.Deleted);
          //efFirst.SaveChanges();
          #endregion
          /***************************查詢數(shù)據(jù)*************/
          //var 語法塘技術(shù)
          //foreach (var item in efFirst.Student)
          //{
          //    string result = string.Format("ID={0},Name={1}", item.ID, item.Name);
          //    MessageBox.Show(result);
          //}
          /****************** ***********通過linq方式查詢***********/
         //EF有延遲加載機(jī)制  select * from student where 1=1
          //所謂延遲加載機(jī)制,當(dāng)你真正需要數(shù)據(jù)的時候,EF才幫我們加載
          var list = from c in efFirst.Student
                     where c.ID > 1
                     select c;
          foreach (var item in list)
          {
              MessageBox.Show(item.Name);
          } 

        ModelFirst方式:

        方式類似,只是需要添加空模型,然后選擇數(shù)據(jù)源,過程不再贅述。

        然后我們看下實現(xiàn)代碼。

      ModelFirstStudentContainer modelFirst = new ModelFirstStudentContainer();
      /*******************************添加************************************************/
      Customer customer = new Customer() { CName = "李小龍", CRemark = "功夫影星" };
      modelFirst.Customer.AddObject(customer);
      Order order1 = new Order() { OrderContent = "雙節(jié)棍", Customer = customer, OrderDate = DateTime.Now };
      modelFirst.Order.AddObject(order1);
      Order order2 = new Order() { OrderContent = "布棍", Customer = customer, OrderDate = DateTime.Now };
      modelFirst.Order.AddObject(order2);
      modelFirst.SaveChanges();
      /*************************************查詢*************************************/
      var temp = from c in modelFirst.Customer
                 where c.Order.Count >= 2
                 select c;
      foreach (var item in temp)
      {
          foreach (var o in item.Order)
          {
              MessageBox.Show(o.OrderContent);
          }
      }
      /*********************************修改********************************************/
      Customer cust = new Customer(){CID = 1,CName = "小李",CRemark = "英雄"};
      modelFirst.Customer.Attach(cust);
      modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Modified);
      modelFirst.SaveChanges();
      /*********************************刪除***********************************************/
      var temp = from c in modelFirst.Order
                 where c.Customer.CID == 1 
                 select c;
      foreach (var item in temp)
      {
          modelFirst.Order.DeleteObject(item);
      }
      Customer cust = new Customer() 
      {
          CID=1
      };
      modelFirst.Customer.Attach(cust);
      modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Deleted);
      modelFirst.SaveChanges(); 

        這次就講到這里,我們用兩種方式:代碼先行和模型方式通過EF對數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行了操作。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多