Entity Framework7 有哪些不一樣?如今開發到什麼程度了? Code First is a bad name,這些年咱們對Code First的理解都錯了 !很震驚吧? Linq To S

Entity Framework7之開篇

1、Entity Framework7 簡介

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

  從上面咱們能夠看到如下幾個重點:git

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

    二、EF7是一個輕量的可擴展的的實體框架;輕量是相較以前的版本,以前的版本由於衆多的遺留問題(好比上下文對象就有ObjectContext和DbContext兩個版本)和以前設計上的一些問題,已經很是複雜和龐大了,其中包含了使用上的複雜性。EF7是一次重大的變革,微軟決定從頭重構它;sql

    三、EF7支持非關係數據存儲了;數據庫

2、Entity Framework7有什麼不一樣

  一、與以前的版本有哪些是相同的?api

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

      a、你仍然能夠繼承DbContext上下文對象,上下文中仍有DbSet<Tentity>屬性;框架

      b、你仍然能夠在DbSet屬性上使用Linq來編寫查詢;工具

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

      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 }

  

  二、有哪些改變?

    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的開發團隊。我我的是支持去掉的。一,不是全部的應用都須要延遲加載;2、很多的EF使用者對它沒有深刻的去了解,常常會有人問,爲何會出現"沒法完成該操做,由於 DbContext 已釋放"這樣的問題。這說明這個功能反而給一部份使用者帶來了困惑。

 

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

    E、對非關係型數據庫的支持,文章開頭部分已經有提到,這裏就很少說了;

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

 

4、EF7的開發計劃

  相信,不少人和我同樣,去年就開始期待EF7的發佈。一年多長長的等待,但是它尚未出來,到底要何時呢?微軟的計劃是2016年,因此你們還得耐心等待。不過,有個好消息是,它是開源的,最新的源代碼在github上,若是你想了解更多的細節,能夠到下面的地址(https://github.com/aspnet/EntityFramework)去克隆或是下載源代碼。下面是EF的開發計劃表

 

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

  

 

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

謝謝你們的持續關注,個人博客地址:http://www.cnblogs.com/VolcanoCloud/

相關文章
相關標籤/搜索