Entity Framework(EF)是使用直接映射到應用程序中業務對象的對象模型於關系數據庫進行交互。它沒有將數據視為行和列的集合,而是將其視為強類型對象(成為實體)的集合。
術語:LinQ to Entity 是指ADO.NET EF實體對象使用LINQ查詢。 LINQ TO SQL 與 ADO.NET EF接近,但使用的情況很少,有一次使用LinQ to SQL 做過一個小網站,感覺比三層使用方便一些,但數據量不大也就無所謂了。 LinQ to SQL 查詢 的介紹。
EF模式會使代碼庫顯得復雜,如果你掌握LINQ,使用EF還是很好的。小量數據可以還是使用以前的,如果數據量比較大使用EF就很好。
實體的作用
強類型稱為實體。正式名稱為 實體數據模型 (EDM) 。它是一組映射到物理數據庫的客戶端類,但是這些實體沒有必要與數據庫架構的命名約定完全一致。你可以根據具體的情況該名稱,定義不同的屬性名,這些屬性講映射到目標表的各個列。
在大多數情況下,客戶端實體類的名稱都與關系型數據庫表相同,你也可以修改它的名稱,主要看情況。
Entity Framework 的基礎知識
EF API 的兩個關鍵部分為 對象服務 和 實體客戶端。
①對象服務的作用
對象服務是EF中的一部分,它在代碼中對客戶端實體進行控制。例如:對象服務跟蹤你對實體的更改(如將汽車的顏色由綠色改為紅色),管理實體間的關系(如查找用戶Steve Hagen的所有訂單)並提供將更改保存到數據庫的方法,以及用XML或二進制序列化服務對實體狀態進行持久化的方法。
對象服務層對所有擴展EntityObject基類的類進行管理,EntityObject是EF編程模型中所有實體類的基類。
②實體客戶端的作用
EF API的另一個主要部分是實體客戶端,它使用基本的ADO.NET數據提供程序來建立數據庫連接,基於實體狀態和LINQ查詢生成SQL語句、將數據庫數據映射到實體。
System.Data.EntityClient的命名空間中瀏覽實體客戶端層的功能。包含了一些的類。
可以看出這些類(EntityCommand和EntityConnection)與ADO.NET數據提供程序中的類驚人地相似。
如果你需要更大程度地控制實體客戶端基於Linq查詢創建SQL語句的方式,你可以使用Entity SQL。它是直接作用於實體的與數據庫無關SQL方言。
③*.edmx文件的作用
實體、真正的數據庫以及映射層都會被划分為3個相關的部分:概念模型、邏輯模型和物理模型。
① 概念模型定義實體以及他們之間的關系(如果有的話)
②邏輯模型將實體和關系(通過外鍵約束)映射到表
③ 物理模型通過指定的存儲細節(如表架構、表分割和索引)來表示特定的數據引擎的能力
在EF的世界里,這三層存存放在基於XML格式的文件里。
*.edmx 文件將生成3個獨立的文件:用於概念模型數據的*.csdl、用於物理模型的*.ssdl、和用於映射層的*.msl.然后這三個基於XML的文件將以二進制資源的形式綁定到應用程序。
④ 書中使用的是4.0版本的,有點老了。。。。。 后面低版本更新為 DbContext和DbSet<T>了 代碼演示的就DbContext個DbSet<T>了
ObjectContext和ObjectSet<T>類的作用
EF的最后一個難點是ObjectContext類,他是 System.Data.Object命名空間的一員。在生成*.emdx文件時,你將得到映射到數據庫表的實體類和一個繼承自ObjectContext類。該類通常用於對象服務於實體客戶端之間的交互。
ObjectContect的常用成員
ObjectContent的派生類作為一個容器,管理哪些存儲在ObjectSet<T>集合中的實體對象。例如:你在AutoLot數據庫的Car表生成*.edmx文件,你會的得到一個AutoLotEntities類。
該類包含一個Cars屬性(復數形式),它封裝ObjectSet<Car>類型的數據成員。Orsers表創建一個EDM,AutoLotEntitesl類將定義另一個Orders屬性,還封裝ObjectSet<Order>類型的成員變量。
System.Data.ObjectSet<T>的一些常用成員
如果對LinQ To SQL有了解的話這個位置就很好了解了,基本一樣。
創建和分析EDM
解決方案資源管理器里面
這個並不能讓我們很好了解EDM,我們需要借助模型瀏覽器來幫助我們。
視圖——》其他窗口——》實體數據模型瀏覽器
主要是模型,表等一些的介紹
可以修改屬性
視圖——》其他窗口——》實體數據模型映射詳細信息
查看生成d*.edmx文件的數據
右鍵決解方案中的NewsEDM.edmx打開方式
、
查看生成的源代碼
補充:
System.Data.Entity;
DbContext類的介紹
Entry這個方法一般可以用來改變實體的狀態
DbEntityEntry 在命名空間 System.Data.Entity.Infrastructure
這個常用
返回的是 EntityState,是個枚舉類型
一般這么用
context.Entry<News>(news的實例).State = EntityState.Deleted; //把你需要改變的類傳到這個方法里面然后改變狀態最后提交到數據庫中就可以了
DbSet<T>類 context.News————》返回的就是 DbSet<News>
對概念模型進行編程
添加
//新建一個實例 using (NewsDBEntities context=new NewsDBEntities()) { try { //添加一個新類到上下文 context.News.Add(new News() { CateID = 2, Contents = "測試類容", CreateDate = DateTime.Now, Title = "測試標題" }); context.SaveChanges(); //保存到數據庫 如同執行了一條SQL Insert語句 } catch (Exception ex) { Console.WriteLine(ex.InnerException.Message); } }
數據庫中多了一條信息
刪除
//新建一個實例 using (NewsDBEntities context=new NewsDBEntities()) { //找到你需要刪除的信息 //① News dd = context.News.First(x => x.NewsID == 3); context.Entry<News>(dd).State = EntityState.Deleted; //改變狀態 這里或者給強類型,看具體情況 //context.Entry(dd).State = EntityState.Deleted = context.News.Remove(newDel) 一個意思 //② 注意LinQ查詢 返回單個 News newDel = context.News.Where(x => x.NewsID == 5).First(); context.News.Remove(newDel); context.SaveChanges(); //提交數據庫 }
更新
把需要更新的數據找出來,然后改變屬性直接提交到數據庫
查詢就跟LinQ查詢一回事。這里就只是演示了簡單的增刪改查。
總結:這里只是簡單的了解了一下EF,到時候會繼續學習更深層的。