本文章是由機器翻譯。

資料點

EF6、 EF7 和ASP.NET5 湯

Julie Lerman

Julie Lerman我 1 月 2015年資料點列,Entity Framework7,迎向未來 」 強調什麼未來在 EF7 的 EF7 α 地望著我寫這篇文章的時間。在 2014 年 12 月,正如那列問題即將發佈之際,EF 團隊作出了關於分期 EF7 發佈的一項重要決定。我設法在最後一刻擠進這篇文章的兩個句子:"據郵報 》 在 bit.ly/1ykagF0,' EF7 — — 優先事項、 重點和初始釋放 ' EF7 的第一個版本將專注于與ASP.NET5 的相容性。 後續版本將添加更多的功能。

從那時起,我發現這正是整理出什麼,,意味著要有點令人困惑。我想確保您充分理解什麼此初始版本的 EF7 目標是否你應該充分利用它,你的選擇是什麼。

它將有助於討論 Microsoft.NET 框架的下一個版本和 5ASP.NET應用程式將運行在之間的區別。我將提供一個高級別的外觀,但查閱 Daniel Roth 的文章,"深潛進 5ASP.NET運行時,"從 2015 年 3 月問題,以獲得一個更深入的理解。然後我將解釋如何 EF6 和 EF7 融進這個。

ASP.NET5 (akaASP.NETvNext) 一直在為了完整的.NET 框架和甚至在 Windows 本身更少依賴。ASP.NET5 之下,您可以創建 Web 應用程式和使用的新的組合的特徵,在ASP.NETMVC 6、 類庫和甚至一個主控台應用程式中設置的 Web Api。如果你認為ASP.NET的作為一種方式來創建 Web 網站,該主控台應用程式是一個謎。但ASP.NET5 真的提供新的"版本"的.NET 框架的應用程式可以坐。事實上,這個新版本目前有兩種口味 — — 一個充分的公共語言運行時 (CLR) 和在新 CoreCLR 上運行的另一種上運行。第三,將在跨平臺 CLR 運行,將會在不久的將來。最精簡的版本稱為.NET 核心,在一個精簡的運行時,CoreCLR 中運行。如果你想回到你早期的教訓,在.NET 框架上,您可能還記得微軟定義公共語言基礎結構 (CLI),這是一種規範。然後微軟建立基於 CLI 的 CLR。單是在 Linux 和 Mac OS X 運行的 CLI 另一個實現。 .NET 應用程式總是取決於 CLI 實現的可用性。我們大多數人都使用Visual Studio和 Windows 創建取決於 CLR 的.NET 應用程式。Xamarin 已成為越來越受歡迎的開發可以在單運行的應用程式。

CoreCLR 和Entity Framework

現在,微軟創造了 CLI 稱為不只是開放源碼的 CoreCLR 精簡的執行,但也可以分發,NuGet 和其他套裝軟體管理器。這使開發人員能夠創建羽量級的應用程式非常適合行動裝置和基於雲計算的伺服器應用程式。它還會移除該約束,將應用程式部署到 Windows 機器只。

Entity Framework6 (和更早) 依靠完整的.NET 框架和完整的 CLR 中,並使用針對 CoreCLR 的應用程式不會運行。但由於規模較小、 可組合的 Api,可以混合和匹配一組基於您需要的功能集,設計了 EF7。例如,如果你的目標一個非­關聯式資料存儲區,你不需要關係或遷移的功能,這些功能對於關聯式資料庫。與 EF7,這種邏輯是在一個單獨的 DLL,你不需要檢索和載入到記憶體中。

當您選擇目標在 CoreCLR 時,你這樣做通過選擇正確的運行時環境。去ASP.NET5,Microsoft 創建了 K 運行時環境 (KRE),所述ASP.NETMVP Gunnar Peipman,"...... 是引導並運行ASP.NETvNext 應用程式所需的代碼。K 運行時將重命名在一些點,在它發佈之前。留意這種變化。例如,KVM (版本管理器) 將成為 DNVM (.NET 版本管理器)。運行時包括諸如編譯系統、 SDK 工具和本機 CLR 宿主"(bit.ly/1x9rpOn)。有 32 位和 64 位版本 KRE,支援在 CoreCLR。你可以看到這些作為ASP.NET5 應用程式中的目標選項圖 1

5ASP.NET應用程式中選擇目標 KRE
圖 1 5ASP.NET應用程式中選擇目標 KRE

EF7 所示,看在我的 Pluralsight 課程,演示視頻之外的應用程式的最簡單方法"迎向未來的Entity Framework7"(bit.ly/18ct13F),是使用ASP.NET5 專案範本,這會給你用 EF7 已經將其連接起來,以提供對您的應用程式的基於身份的身份驗證解決方案。

如中所示,通過選擇ASP.NETWeb 應用程式,然後ASP.NET5 起動機 Web 範本,啟動圖 2

創建新 5ASP.NET應用程式與Entity Framework7 預配置
圖 2 創建新 5ASP.NET應用程式與Entity Framework7 預配置

你會發現: EF7 EntityFramework.SqlServer 和 EntityFramework.Commands 的套裝軟體已被選中。SqlServer 套裝軟體將導致其依賴項 (EntityFramework.Core,EntityFramework.Relational) 將被拉扯。

你可以看到這在 project.json 檔中,其中列出了 NuGet 來檢索其依賴項的節中的套裝程式。下面是從這一節的幾行:

"dependencies": {
  "EntityFramework.SqlServer": "7.0.0-beta2",
  "EntityFramework.Commands": "7.0.0-beta2",
  "Microsoft.AspNet.Mvc": "6.0.0-beta2",

你還可以看到什麼最終參考一節,其中預設列出引用ASP.NET5.0 和ASP.NET核心 5.0 版本的應用程式中。圖 3 ASP.NET核心 5.0 引用擴展顯示了清單。請注意因為該範本當前目標的 Beta2 版本,您將看到遷移包引用,雖然在以後的版本中,遷移成為關係 API 的一部分。

兩個ASP.NET5.0 和ASP.NET核心 5.0 引用包含Entity Framework7 包和 Api
圖 3 兩個ASP.NET5.0 和ASP.NET核心 5.0 引用包含Entity Framework7 包和 Api

ASP.NET5 EF7 擁抱和嚴重依賴依賴注入 (DI)。你可以看到在該專案中的 Startup.cs 圖 4 讓知道它應該使用Entity Framework的應用程式的邏輯,其SQL ServerAPI 和單預定義 DbCoNtext 用於安全,ApplicationDbCoNtext。你可以看到同樣的情況下被連接起來,作為應用程式標識服務。連接字串存儲在 config.json 檔中,該檔案備份啟動建構函式電線,因此應用程式將能夠找到它需要的時候。

圖 4 部分上市的預設 Startup.cs

public class Startup {
  public Startup(IHostingEnvironment env) {
    Configuration = new Configuration()
      .AddJsonFile("config.json")
      .AddEnvironmentVariables();
  }
  public IConfiguration Configuration { get; set; }
  public void ConfigureServices(IServiceCollection services) {
    services.AddEntityFramework(Configuration)
      .AddSqlServer()
      .AddDbContext<ApplicationDbContext>();
    services.AddIdentity<ApplicationUser, IdentityRole>(Configuration)
      .AddEntityFrameworkStores<ApplicationDbContext>();
       services.AddMvc();  }

專案範本現在設置,預設情況下,使用 EF7,並使用其邏輯,是否你精簡的 CoreCLR 或完整的.NET 框架的目標。事實上,預設情況下,該專案不被定義為在 CoreCLR 下運行,但要使用完整的.NET 框架。因此,讓我們看看此選項適合的地方。

充分 CLRASP.NET5 (和Entity Framework)

那裡是.NET Framework 的到來,.NET 框架 4.6 更新,它會讓你繼續創建的所有樣式的軟體你已經去了 — — 從 Windows 表單和 Web 表單Windows Presentation Foundation(WPF) 和ASP.NETMVC 5 應用程式。由於所示的其他版本 KRE 圖 1,KRE CLR amd64 和 KRE-CLR-x 86,它也是可能要運行ASP.NET5 上完整的.NET 框架應用程式。這讓你有你的蛋糕和吃它,太,如果你想要受益于其他新功能的ASP.NET5,例如 MVC 6 或新的 Web API,這是 MVC 控制器和 Web API 的合併。因為你的完整的.NET 框架和 CLR 的目標,並且可以訪問其套完整的功能,它也給你向後相容性。預設情況下,project.json 檔表示您想要將無法運行下任一版本的 CLR 的應用程式:

"frameworks": {
      "aspnet50": { },
      "aspnetcore50": { }
    },

您可以刪除"aspnetcore50"線完全 (以及在前一行末尾的逗號) 和將兩方面的影響。首先,ASP.NET核心 5.0 節會消失從解決方案資源管理器中的引用。第二,KRE 目標顯示在圖 1 將減少到只有 KRE CLR 選項。

你仍然會是針對 EF7 和得到所有的好處這一新版本。但是,一直沒有明顯是因為 KRE CLR 物件完整的.NET 框架,它是與Entity Framework6 相容。 這意味著如果您有現有的 EF6 邏輯,它是可能使用,結合ASP.NET5 (雖然不是 CoreCLR 的版本),和得益 5ASP.NET的新功能,而不必重新編寫代碼 EF6 與 EF7 對齊。

ASP.NET5 (充分 CLR) 與 EF6

知道這可能的當然我不得不嘗試 EF6ASP.NET5 解決方案。請記住,我實現這一目標所採取的辦法很可能需要更改之間的非常早期的版本,我現在 (在 2015 年 2 月) 使用,當ASP.NET5 和Visual Studio2015年被釋放。

我發現在實現這一目標最重要的因素保持Entity Framework邏輯和依賴關係在一個單獨的專案從ASP.NET5 專案。我通常設計我的應用程式這道,反正,而不是單個專案中的所有層的我的應用程式。與一個單獨的專案致力於 EF,你不必擔心拉 EF7 Api 中飛ASP.NET5 應用程式。

而不是開始用ASP.NET5 起始 Web 專案,您最好使用ASP.NET空專案範本。Project.json 檔有只有一個依賴項指定,Microsoft.Asp.NET.Server.IIS。

接下來,創建第二個專案。我選擇了一個.NET 4.6 類庫專案。然後,我可以使用封裝管理員主控台來安裝 EF6 通過確保我指 nuget.org 套裝軟體源以及對類庫作為預設的專案。在這一點上,我是能夠調用安裝套裝軟體 entityframework,因為我一直在做。這帶來了 entityframework.dll 和 entityframework.sqlserver.dll 到專案中。

若要測試,我創建了一個簡單的類,Ninja.cs (因為我認為 EF6 為忍者版,而 EF7 是武士版):

public class Ninja {
    public int Id { get; set; }
    public string Name { get; set; }
  }

和暴露忍者 DbSet DbCoNtext:

public class NinjaContext : DbContext {
  public NinjaContext()
    :base(@"Data Source=(localdb)\mssqllocaldb;
          Initial Catalog=NinjaContext;
          Integrated Security=True;"){ }
  public DbSet<Ninja> Ninjas { get; set; }
}

為簡單起見,在測試中,我已經硬編碼SQL Server連接字串直接進入我的 DbCoNtext 類。

與我的模型定義,可以啟用遷移、 添加一個新的遷移和創建資料庫,因為我一直在做。請注意當你到資料項目目中安裝了 EF6,我離開了 app.config 檔的創建包,所以我可以將該專案設置為啟動專案,然後遷移命令將能正常工作。我也用 DbMigrationsConfiguration 種子方法來預植入資料庫幾個忍者。

我不想讓 EF 直接接到 5ASP.NET應用程式和創建版本混亂,所以我有一個類封裝了我需要的查詢我 EF6 專案中。我叫它存儲庫因為它適合我的目的,但這並不是遵循資源庫模式的類。這並不是具有挑戰性的一個演示應用程式與單個查詢中,但您可以使用您最喜歡的模式分離關注點更複雜的應用程式:

public class Repository  {
  public List<Ninja> GetAllNinjas() {
    using (var context=new NinjaContext())
    {
      return context.Ninjas.ToList();
    }
  }
}

與資料訪問所有專案都設置,我可以返回到ASP.NET5 專案。我創建了一個簡單的控制器來檢索並返回一個視圖:

public class NinjaController : Controller
  {
    public IActionResult Index()
    {
      var repo = new Repository();
        return View(repo.GetAllNinjas());
      }
    }
  }

我還將創建簡單的 Index.cshtml,其中會列出通過控制器的忍者:

@model List<EF6Model.Ninja>
@{
  ViewBag.Title = "EF6 Ninjas";
}
@foreach (var item in Model)
{
  @Html.Label(item.Name);
}

最後, 圖 5 顯示代碼添加到 startup.cs 檔中,將 MVC 服務注入,並指定路由到忍者控制器。

圖 5 啟動類配置ASP.NET5 應用程式,它使用Entity Framework6

public class Startup  {
  public void Configure(IApplicationBuilder app) {
    app.UseMvc(routes =>
    {
      routes.MapRoute(
      name: "default",
      template: "{controller}/{action}/{id?}",
      defaults: new { controller = "Ninja", action = "Index" });
     });
  }
  public void ConfigureServices(IServiceCollection services)  {
    services.AddMvc();
  }
}

我還刪除 aspnetcore50 框架從 project.json 檔中,確保我只針對完整的 CLR。

使用資料庫和由遷移創建一些種子資料,我是能夠看到 5ASP.NET應用程式處理的基於 EF6 的專案,顯示了使用 EF6 檢索的資料 (請參閱圖 6)。

ASP.NET5 應用程式中顯示資料通過Entity Framework6
圖 6ASP.NET5 應用程式中顯示資料通過Entity Framework6

Will我馬上就會使用 EF7 和ASP.NET5 嗎?

很感在 EF7 的新功能和學習如何最好地利用它們。我也期待著瞭解程式設計ASP.NET5 打開此新大道。在 CoreCLR 將變得更加富有,隨著它的發展,將 EF7。我與 EF7 狀態印象深刻,因為它將會發佈了與ASP.NET5。 但因為我不是為 Web 開發人員,我沒有理由在生產代碼中處於最前沿的ASP.NET,工作和 EF 團隊已經明確它建議僅 5ASP.NET應用程式中使用 EF7,將被標記為搶鮮,初始版本。否則,小組的指導是要等到 EF7 作為一個真實的版本發佈。因此,我可能說得等待後續版本的 EF7,但繼續遵循和實驗專案,隨著它的發展獲得更多的奇偶性與我可能,否則錯過的 EF6 的特點。

在 CoreCLR 目前太出血邊緣為我的口味。如果找到了一個適合什麼的場景將會 EF7 搶鮮,可用在滿 5、ASP.NETCLR 釋放,以及該功能設置,然後我會急切地想走這條道路。然而,我會停止,等待後續的版本是更有可能的。然後ASP.NET5 和 CoreCLR 將更豐富,太。對我來說,就個人而言,直到那時時間將提供一個機會來探索和瞭解這些工具,準備以後釋放。

同時,我強烈推薦閱讀Scott格思裡的博文裡,"引入ASP.NET5,"在 bit.ly/1wV4zzm 有更好的理解的所有新功能,ASP.NET5 帶來了。可組合的 Api 只是許多激動人心的改進,開發者將獲得在這一轉變中的一種。


Julie Lerman 是 Microsoft MVP,.net 的導師和顧問住在佛蒙特州的丘陵。你可以找到她提出關於資料訪問和 other.NET 的主題,在使用者組和世界各地的會議。她的博客 thedatafarm.com/blog ,是作者的"程式設計Entity Framework"(2010 年),以及代碼第一版 (2011 年) 和 DbCoNtext 版 (2012 年),所有從 O'Reilly 媒體。跟著她在 Twitter 上 twitter.com/julielerman ,看看她的 Pluralsight 課程 juliel.me PS 的-視頻

由於下面的技術專家,檢討這篇文章: Rick Strahl
Rick Strahl 是大人物在西部風能技術,坐落在美麗的夏威夷茂宜島,夏威夷。之間風帆衝浪會話和 spikey 頭髮的冒險經歷,瑞克被軟體發展人員超過 25 年,自很早的時候,互聯網的建設業務和 Web 應用程式,當你需要一個手搖轉動曲柄 (或一雙絲撚接器) 以獲得線上。瑞克今天建立以客戶為中心的 Web 應用程式和服務為客戶提供 HTML5,JavaScript 和移動 Web 技術,在前端,使用 AngularJS 和ASP.NET堆疊和背面的 Microsoft 技術結束。瑞克公司,西部風能技術也產生了一系列的開發相關的工具,包括西部風 WebSurge、 西部風網路監視器和 Html 説明產生器。 裡克還保持著大量的開源庫在 github.com/RickStrahl ,你可以找到自己的博客 weblog.west wind.com 或與他直接聯繫 rstrahl@west-wind.com