成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解ASP.NET MVC 2中的新ADO.NET實體框架

開發(fā) 后端
對于ADO.NET實體框架,我們把它當(dāng)做ASP.NET MVC 2的一項重大轉(zhuǎn)變。它克服了以往的錯誤,提供更強(qiáng)的API,這一切都有利于開發(fā)人員的工作。

.NET框架4.0的發(fā)行推出了許多優(yōu)秀的增強(qiáng)功能,其中當(dāng)首推ADO.NET實體框架。該框架已經(jīng)克服了以前的許多錯誤,并提供了一組增強(qiáng)的API,其中包括許多新的LINQ to SQL框架方面的改善。在本文中,我們將使用這些API的功能來創(chuàng)建一個通用版本的數(shù)據(jù)倉庫。

一、實體框架概述

實體框架針對數(shù)據(jù)模型提供了一些更方便的操作方法。默認(rèn)情況下,設(shè)計器可以生成一個描述數(shù)據(jù)庫的模型。

盡管表格間的映射未必都是1:1的映射。每個表格使用一個ObjectSet加以描述,進(jìn)而ObjectSet對象又提供了相應(yīng)的方法來創(chuàng)建、更新或反射實體和實體間的關(guān)系。實體框架使用一個實體鍵(這是一個看上去像EntitySet=Customers;CustomerID=4的值)來唯一標(biāo)識模型內(nèi)的一個實體及其標(biāo)識符。使用實體鍵,我們就有了一個方法來更新對象、從數(shù)據(jù)庫中查詢的對象,等等。

二、創(chuàng)建和更新

讓我們首先來看一個基類示例倉庫的實現(xiàn)。我想分別地討論CRUD操作,首先來學(xué)習(xí)創(chuàng)建和更新操作。

清單1:創(chuàng)建/更新操作

  1. public abstract class BaseRepository<T> : IRepository<T>  
  2.     where T : EntityObject  
  3. {  
  4.     public virtual bool CreateNew(T entity)  
  5.     {  
  6.         if (entity == null)  
  7.             throw new ArgumentNullException("entity");  
  8.         var ctx = CreateContext();  
  9.         try 
  10.         {  
  11.             ctx.AddObject(this.GetFullEntitySetName(ctx), entity);  
  12.             ctx.SaveChanges();  
  13.             return true;  
  14.         }  
  15.         catch (Exception ex) { .. }  
  16.     }  
  17. protected abstract string GetEntitySetName(AdventureWorksObjectContext context);  
  18.     public virtual bool Update(T entity)  
  19.     {  
  20.         if (entity == null)  
  21.             throw new ArgumentNullException("entity");  
  22.         var ctx = CreateContext();  
  23.         entity.EntityKey = ctx.CreateEntityKey(this.GetFullEntitySetName(ctx),  
  24.                   entity);  
  25.         try 
  26.         {  
  27.             T oldEntity = (T)ctx.GetObjectByKey(entity.EntityKey);  
  28.             if (oldEntity == nullreturn false;  
  29.             ctx.ApplyCurrentValues(this.GetFullEntitySetName(ctx), entity);  
  30.             ctx.SaveChanges();  
  31.             return true;  
  32.         }  
  33.         catch (Exception ex) { .. }  
  34.     }  

上述代碼中,我們的BaseRepository類使用ObjectContext類(需要使用CreateContext方法創(chuàng)建每一個請求)和AddObject方法實現(xiàn)添加新的對象,而通過使用ObjectContext類和AttachTo方法實現(xiàn)更新現(xiàn)有的對象。對于創(chuàng)建對象而言,我們需要知道要更新哪種類型的方法。使用我們的助理GetFullEntitySetName方法可以很好地處理這個問題。這個方法能夠返回要添加的標(biāo)識實體的對象(一個如DotNetSamplesObjectContext.Customers的值)的標(biāo)識。

對于更新一個對象而言,我們遇到了與上下文有關(guān)的問題。每個從數(shù)據(jù)庫中查詢的對象都使用ObjectStateManager類中的ObjectContext成員進(jìn)行跟蹤。MVC綁定過程實際上已經(jīng)構(gòu)建了它自己的對象副本,并通過反射把這些值注入到此對象中。這意味著我們有一個新的對象,而不是附加到ObjectContext上的對象。

這不是一個大問題,我們首先需要查詢舊記錄。這將為我們的實體生成一個ObjectStateEntry,并且我們可以成功地執(zhí)行更新(因為它需要知道舊記錄是什么)。該實體還需要使用一個EntityKey實體,提供適當(dāng)?shù)闹麈I信息(記住,EntityKey是確定出已存在的實體的唯一的方式)。

***,調(diào)用ApplyCurrentValues能夠把MVC框架所創(chuàng)建的新的實體值應(yīng)用到舊實體上。在這里,我們?nèi)匀恍枰褂脤嶓w集的名稱來唯一標(biāo)識它。

三、元數(shù)據(jù)

在上面代碼中,我們看到了實體集名稱的使用方法,用來確定ADO.NET實體框架中的實體的類型。例如,它可以用于描述Products表和Product實體之間的一個映射。還例如,對于我們的產(chǎn)品信息庫來說,它可以執(zhí)行下列操作以獲取實體集。

清單2—返回產(chǎn)品實體集名稱

  1. protected override Expression<Func<DA.Product, object>> GetDefaultSortingExpression()  
  2. {  
  3.     return j => j.ProductID;  
  4. }  
  5. protected override string GetEntitySetName(AdventureWorksObjectContext context)  
  6. {  
  7.     return context.Products.EntitySet.Name;  

我們很快將會看到GetDefaultSortingExpression的使用。請注意,這里的GetFullEntitySetName方法把對象的上下文名稱追加到實體集名稱的后面,以取得添加,更新等操作對應(yīng)對象的正確名稱。 

四、數(shù)據(jù)檢索

一般地,我們還可以執(zhí)行一些讀取操作,如下所示。

清單3—從數(shù)據(jù)庫讀取數(shù)據(jù)

  1. protected virtual string GetKeyProperty()  
  2. {  
  3.     PropertyInfo[] properties = typeof(T).GetProperties();  
  4.     foreach (PropertyInfo property in properties)  
  5.     {  
  6.     EdmScalarPropertyAttribute attrib = property.GetCustomAttributes
  7. (typeof(EdmScalarPropertyAttribute), false).FirstOrDefault() as EdmScalarPropertyAttribute;  
  8.         if (attrib != null && attrib.EntityKeyProperty)  
  9.             return property.Name;  
  10.     }  
  11.     return null;  
  12. }  
  13. public virtual T Get(int key)  
  14. {  
  15.     string prop = this.GetKeyProperty();  
  16.     if (string.IsNullOrEmpty(prop))  
  17.         return null;  
  18.     var ctx = CreateContext();  
  19.     return (T)ctx.GetObjectByKey(new EntityKey(this.GetFullEntitySetName(ctx),  
  20.         prop, key));  
  21. }  
  22. public virtual IQueryable<T> GetAll(int pageIndex, int pageSize)  
  23. {  
  24.     var ctx = CreateContext();  
  25. return ctx.CreateObjectSet<T>(this.GetFullEntitySetName(ctx)).OrderBy(this.GetDefaultSortingExpression())  
  26.         .Skip(pageIndex * pageSize).Take(pageSize);  

默認(rèn)設(shè)計器生成的每個實體類都將把一組屬性添加到它對應(yīng)的每一個字段屬性上。其中,EdmScalarPropertyAttribute擁有EntityKeyProperty設(shè)置,被設(shè)置為true,對應(yīng)于實體的鍵字段。這就提供了一種靈活的方式來確定主鍵列而不需要使用一個lambda表達(dá)式手動指定。

跟蹤分析到ObjectContext方法內(nèi)部,你會發(fā)現(xiàn)通過使用實體集名稱構(gòu)造一個對象集合可以取得一個數(shù)據(jù)實體的所有結(jié)果。對象集可以使用LINQ擴(kuò)展方法來按索引頁和大小加以過濾,例如只取得一個包含20個對象的結(jié)果集。不幸的是,調(diào)用Skip和Take方法需要先對對象進(jìn)行排序。同樣,你需要使用一個自定義Lambda表達(dá)式來執(zhí)行這個排序操作。

GetObjectByKey方法實際上使用它的鍵從它的數(shù)據(jù)庫中檢索對象。我們可以利用我們的新的GetKeyProperty反射方法來獲取主鍵屬性的名稱。正如你所看到的,我們不能直接使用這個鍵而需要使用一個EntityKey對象來檢索它。

五、最終實現(xiàn)

我可以利用一個類似下面的信息庫,并且已經(jīng)在基類中實現(xiàn)了Create、Delete、Update、Get和GetAll方法。我們只需要關(guān)心的是,實現(xiàn)其他的查詢操作。

清單4—最終版本的數(shù)據(jù)倉庫類(其他其他前面已列舉的內(nèi)容)

  1. public class ProductsRepository : BaseRepository<DA.Product>  
  2. {  
  3. protected override Expression<Func<DA.Product, object>> GetDefaultSortingExpression()  
  4.     {  
  5.         return j => j.ProductID;  
  6.     }  
  7.     protected override string GetEntitySetName(DA.DotNetSamplesObjectContext context)  
  8.     {  
  9.         return context.Products.EntitySet.Name;  
  10.     }  

在大多數(shù)情況下,代碼生成將是***的選擇,有助于減少重復(fù)代碼,但是,實體框架做了大量的內(nèi)部基礎(chǔ)工作(實現(xiàn)基礎(chǔ)代碼的自動生成)來實現(xiàn)這些特征支持而無需我們編寫任何代碼。

六、結(jié)論

ADO.NET實體框架提供了大量基礎(chǔ)功能,節(jié)省了開發(fā)人員大量的代碼編寫時間。在本文中,我們討論了ObjectContext類提供給我們的許多方法,其中包括從后端數(shù)據(jù)庫獲取和存入數(shù)據(jù),等等。

***,我們有理由相信,ADO.NET實體框架必將在ASP.NET MVC框架應(yīng)用程序開發(fā)的數(shù)據(jù)管理模型開發(fā)中發(fā)揮越來越大的作用。

【編輯推薦】

  1. Linq匿名類型簡單概述
  2. Linq隨機(jī)讀取數(shù)據(jù)淺析
  3. Linq Lambda表達(dá)式全面分析
  4. Linq擴(kuò)展方法簡單分析
  5. 初探Linq局部變量類型 
責(zé)任編輯:彭凡 來源: ITPUB
相關(guān)推薦

2009-11-12 14:55:16

ADO.NET實體框架

2009-12-29 10:26:43

ADO.NET實體框架

2009-07-24 13:20:44

MVC框架ASP.NET

2009-11-12 15:12:57

ADO.NET實體框架

2010-02-03 09:50:58

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2010-10-12 09:52:02

ASP.NET MVC

2009-10-29 09:15:32

ASP.NET MVCDropDownLis

2010-10-09 08:41:40

Mono 2.8

2009-07-22 13:08:55

拯救UpdatePanASP.NET MVC

2011-04-18 09:35:59

ASP.NET MVC

2010-03-19 09:17:16

ASP.NET MVC

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2011-04-14 09:19:22

ASP.NET MVC

2010-06-23 15:44:03

ASP.NET MVC

2010-03-23 08:42:26

ASP.NET MVC

2009-11-24 15:11:21

ASP.NET MVC
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99久久精品国产一区二区三区 | 国产成人久久精品一区二区三区 | 97影院2| 女人天堂av | 久久久黑人 | 天堂在线1 | 午夜精品一区二区三区在线视频 | 国产成人99av超碰超爽 | 亚洲系列第一页 | 91在线免费视频 | www.色53色.com | 黄色大片免费播放 | 国产精品免费视频一区 | 精品免费国产一区二区三区四区 | 亚洲成色777777在线观看影院 | 欧美日韩一区二区在线 | 99久久婷婷国产亚洲终合精品 | 欧美成视频 | 精精精精xxxx免费视频 | 懂色中文一区二区在线播放 | 亚洲视频免费播放 | 亚洲久久 | 在线观看亚洲欧美 | 毛片高清 | 欧美一区2区三区3区公司 | 国产视频一区二区在线观看 | 亚洲精品久久久久中文字幕欢迎你 | 欧美精品区 | 一级片aaa| 精品99爱视频在线观看 | 久久精品国产一区二区电影 | 韩国理论电影在线 | 国产欧美精品一区二区三区 | 亚洲激情综合网 | 国产粉嫩尤物极品99综合精品 | 国产美女黄色片 | 一级黄色绿像片 | 亚洲一区二区视频 | 91久久国产综合久久 | 玖玖视频 | 免费成人在线网站 |