Entity Framework7 有哪些不同?現在開發到什么程度了?


Entity Framework7之開篇

一、Entity Framework7 簡介

  Entity Framework7簡稱EF7,是微軟正在開發的最新的在.NET應用中首選的數據訪問技術。它是輕量級和可擴展的啟用新的平台和新的數據存儲的實體框架版本。以下的應用: Windows Phone、 Windows 應用商店,ASP.NET 5 和傳統的桌面應用程序,現在都可以利用的實體框架。EF7除了支持關系型數據庫, 還支持如 Azure 表和Redis非關系型數據存儲。

  從上面我們可以看到以下幾個重點:

    1、EF7跟之前版本一樣,仍然是一項數據訪問技術;

    2、EF7是一個輕量的可擴展的的實體框架;輕量是相較之前的版本,之前的版本因為眾多的遺留問題(比如上下文對象就有ObjectContext和DbContext兩個版本)和之前設計上的一些問題,已經非常復雜和龐大了,其中包含了使用上的復雜性。EF7是一次重大的變革,微軟決定從頭重構它;

    3、EF7支持非關系數據存儲了;

二、Entity Framework7有什么不同

  1、與之前的版本有哪些是相同的?

    使用它時,頂層的接口跟之前的版本基本相同,

      a、你仍然可以繼承DbContext上下文對象,上下文中仍有DbSet<Tentity>屬性;

      b、你仍然可以在DbSet屬性上使用Linq來編寫查詢;

      c、你仍然可以使用DbSet屬性上的Add和Remove方法;

      d、你仍然可以使用DbContext.ChangeTracker和DbContext.Database屬性訪問對象跟蹤和調用數據庫相關的api;

      例如:下面的代碼在EF6.x和EF7中寫法一樣

 1 using (var db = new BloggingContext())
 2 {
 3  db.Blogs.Add(new Blog { Url = "blogs.msdn.com/adonet" });
 4  db.SaveChanges();
 5  
 6  var blogs = from b in db.Blogs.Include(b => b.Posts)
 7              orderby b.Name
 8              select b;
 9 
10  foreach (var blog in blogs)
11  {
12   Console.WriteLine(blog.Name);
13   foreach (var post in blog.Posts)
14   {
15    Console.WriteLine(" -" + post.Title);
16   }
17  }
18 }

  

  2、有哪些改變?

    A、新特性

      a、支持對關系型數據的批量更新。 什么意思就不用細說了吧,在這之前,很多人噴糞EF,就是說他的更新效率太低,如果要實現批量更新,特別插入時,需要借助sql語句或是第三方工具類。相信這是很多人期待的功能;

      b、支持唯一約束。它允許你在實體內除主鍵外額外標識一個鍵,將他們用作外鍵。

    B、行為(Behavior)改變

      在EF6和前期的版本中,頂層API就有很多不直觀的行為,雖然EF7盡可能是保持頂層API的相同,但仍去掉了一些限制並添加了一些我們期待的行為。什么意思呢?這聽起來有點迷糊,舉個例子來說明吧,以前的查詢,雖然Linq給我們帶來了很大方便,但限制多呀,整個Linq查詢翻譯成一條單獨的sql查詢,Linq查詢中只能包含EF能翻譯成sql的語句或方法;還有就是sql的生成,有時生成了很復雜、效率不高,且不是我們希望的sql語句。EF7改變這種情況,可以返回多結果集,sql評估工作也不是在數據庫端來做了,變更到客戶端。這樣就為生成sql提供了很大的靈活性。如果還有點暈,沒關系,先有個印象就行。

    C、變得更加簡單、靈活

      直接使用一個例子來說明吧。我們想通過EF的元數據來獲取Blog實體被映射到數據庫中的哪一張表。在這之前,我們的代碼會是這樣:

 1 using (var context = new BloggingContext())
 2 {
 3  var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace;
 4  var objectItemCollection = ((ObjectItemCollection)metadata.GetItemCollection(DataSpace.OSpace));
 5  
 6  var entityType = metadata
 7   .GetItems<EntityType>(DataSpace.OSpace)
 8   .Single(e => objectItemCollection.GetClrType(e) == typeof(Blog));
 9  
10  var entitySet = metadata
11   .GetItems<EntityContainer>(DataSpace.CSpace).Single()
12   .EntitySets
13   .Single(s => s.ElementType.Name == entityType.Name);
14  
15  var mapping = metadata.GetItems<EntityContainerMapping>(DataSpace.CSSpace).Single()
16   .EntitySetMappings
17   .Single(s => s.EntitySet == entitySet);
18  
19  var table = mapping
20   .EntityTypeMappings.Single()
21   .Fragments.Single()
22   .StoreEntitySet;
23  
24  var tableName = (string)table.MetadataProperties["Table"].Value ?? table.Name;
25 }

 

      在EF7中會代碼會是這樣:

1 using (var db = new BloggingContext())
2 {
3  var tableName = db.Model.GetEntityType(typeof(Blog)).Relational().Table;
4 } 

 

    D、去掉了一些特性

      a、類型映射多個實體集(MEST)。這個特性,估計用的人很少,正是因為使用的人少,所以才去掉。它是什么意思呢?就是一個類型對應數據庫中的多張表,例如:表Product 和 RetriedProduct都映射到Product類。如果你還有這樣的需求,使用繼承是更好的選擇。

      b、非常復雜的類型映射。在EF6.x中,可能在一個繼承映射中組合TPH,TPT和TPC。EF7不再支持這種復雜的映射了,它要求你的CLR 類型盡量跟表結構保持一至。至於為什么,我相同不少人到現在都還沒有弄明白什么是TPH,TPT,TPC,那更說不上靈活運行了,這也是導致EF6.x MetadataWorkspace異常復雜的主原之一。

      c、去掉edmx建模。這可能會讓很多人失望,因為它曾經給我們帶來多么美好的回憶。但它有很多的不足,比較一些復雜的需求,不適應ddd分層設計,不符合現在流行的POCO等。最主要的是,有更好的選擇code-based建模,這就是我們常說的code-first。 可能你會有疑問,怎么code-first和edmx是平級概念,它不是跟db-first、model-first平級的嗎? 沒錯,它是跟edmx平級的,更詳細的解釋請查看我的另一篇博客Code First is a bad name,這些年我們對Code First的理解都錯了 !很震驚吧? 

      d、ObjectContext API。它陪着EF一起成長,到EF4.1時才被DbContext弄到幕后.不過DbContext只是它的外觀模式,底層仍然是使用的它。有時需要使用一些高級的功能時,我們還得想辦法把它找出來。去掉它並不意味着它以前的一些功能不能用了。EF7重寫了底層,把之前一定需要ObjectContext才能使用的api包含在了DbContext中,並且讓調用更加清晰,簡單。

      e、延遲加載。 這功能相信大家不陌生,它一直被當成EF的一大特點,但現在,它將要從EF7中去掉。我不確定最終的版本微軟會不會把它請回來,因為這一點存在很大的爭論。無論是我們這些開發人員,還是EF的開發團隊。我個人是支持去掉的。一,不是所有的應用都需要延遲加載;二、不少的EF使用者對它沒有深入的去了解,經常會有人問,為什么會出現"無法完成該操作,因為 DbContext 已釋放"這樣的問題。這說明這個功能反而給一部份使用者帶來了困惑。

 

  這些變化並不是最終的,也許文中說的,會發生改變。當然這里也不可能列出所有的變化點,畢竟EF7還在處於開發過程中。總之,它是一個革命性的版本,以至於有人在爭論應該叫他EF7呢,還是EF1。

    E、對非關系型數據庫的支持,文章開頭部分已經有提到,這里就不多說了;

    F、官方支持SQLite; 這估計對很多開發人員來說是福音,至少,這之前我為了使用Linq to Sqlite 折騰了不少時間,在博客園的處女作就為他而生 Linq To Sqlite 一一二二

 

四、EF7的開發計划

  相信,很多人和我一樣,去年就開始期待EF7的發布。一年多長長的等待,可是它還沒有出來,到底要什么時候呢?微軟的計划是2016年,所以大家還得耐心等待。不過,有個好消息是,它是開源的,最新的源代碼在github上,如果你想了解更多的細節,可以到下面的地址(https://github.com/aspnet/EntityFramework)去克隆或是下載源代碼。下面是EF的開發計划表

 

  今天 就先說這么多吧,感謝你的閱讀! 如果有什么不當的地方,或是文中沒有說到的,請留言,謝謝!如果覺得不錯,請動動鼠標,點一下推薦吧~

  

 

實體框架交流QQ群:  458326058,歡迎有興趣的朋友加入一起交流

謝謝大家的持續關注,我的博客地址:http://www.cnblogs.com/VolcanoCloud/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM