本文章是由機器翻譯。

資料點

將現有的專案移至 EF 5

朱莉列爾曼

 

Julie Lerman
之間變化向微軟.net 框架 4.5 有大量的修改和改進實體框架 Api 的核心。最引人矚目的是新的實體框架緩存的方式你 LINQ to 實體查詢自動刪除翻譯成 SQL 查詢,反復使用它時的性能開銷。此功能被稱為 Auto-Compiled 的查詢,並且您可以閱讀更多關於它和其他的性能改進,在團隊的博客張貼內容,"偷偷地預覽:實體框架 5 的性能改進,"在 bit.ly/zlx21L。它由.net 框架 4.5、 內實體框架 API,所以即使.net 4 應用程式使用實體框架受惠"免費"上機器 with.NET 4.5 安裝運行時此功能的獎金。

其他有用的新功能,內置的核心 API 需要一些編碼對你的一部分,其中包括支援枚舉、 空間資料類型和表值函數。Visual Studio 2012 實體資料模型 (EDM) 設計器具有一些新功能,包括創建模型的不同視圖的能力。

我做我 EF 相關編碼這幾天,使用 DbCoNtext API,這提供了代碼第一次的功能,分別從.net 框架的大部分。這些功能更流暢和頻繁提高實體框架,微軟的途徑,他們包含在單個庫命名為 EntityFramework.dll,其中您可以安裝到您通過 NuGet 的專案。

要利用枚舉支援和添加到英孚的.net 框架 4.5 其他功能,您需要 EntityFramework.dll,EF 5 相容的版本。此包的第一版有 5 的版本號。

我有很多使用 EF 4.3.1 的應用程式。此版本包括引入 EF 4.3,再加上幾個次要的改變被添加後不久的遷移支援。在此列我會向您展示如何移動的應用程式使用 4.3.1 EF 英孚 5 到利用.net 4.5 的新的枚舉支援。這些步驟也適用于使用的 EF 4.1、 4.2 或 4.3 的專案。

我會開始使用一個簡單的演示潔具解決方案,DomainClasses,DataLayer,是一個主控台應用程式中,如中所示的一個另有一個專案圖 1

The Existing Solution That Uses EF 4.3.1
圖 1 使用 EF 4.3.1 的現有解決方案

此解決方案建在 Visual Studio 2010 年使用.net 框架 4 和 EF 4.3.1 EntityFramework.dll 的版本。

DomainClasses 專案已經塞進單個檔中所示的兩個類圖 2,使用一個受歡迎的主題的示例代碼:Twitter。這些類是高音單元和推。

圖 2 原始域類

using System.ComponentModel.DataAnnotations;
namespace DataPointsDemo.DomainClasses
{
  public class Tweeter
  {
    public Tweeter()
    {
      Tweets = new List<Tweet>();
    }
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [MaxLength(10),Column("ExperienceCode")]
    public string Experience { get; set; }
    [MaxLength(30), MinLength(5)]
    public string UserName { get; set; }
    [RegularExpression(@"(\w[-._\w]*\w@\w[-._\w]*\w\.
\w{2,3})")]
    public string Email { get; set; }
    public string Bio { get; set; }
    public DateTime CreateDate { get; set; }
    public byte[] Avatar { get; set; }
    public ICollection<Tweet> Tweets { get; set; }
    public string AliasPlusName
    { get { return Name + "(" + UserName + ")"; } }
  }
  public class Tweet
  {
    public int Id { get; set; }
    public DateTime CreateDate { get; set; }
    public string Content { get; set; }
    [Range(1, 5),Column("RatingCode")]
    public int Rating { get; set; }
    public Tweeter Alias { get; set; }
    public int AliasId { get; set; }
  }
}

這一專案使用資料的注釋不只添加有效性驗證,(如 RegularExpression) 但也要定義的配置一些 — — MaxLength、 MinLength 和列。 最後,一列中,指定的列的名稱,將資料庫表中的欄位的經驗和評級地圖。

所有三個專案引用 EntityFramework.dll (版本 4.3.1)。 通常情況下,我從我的域類,保持 EntityFramework.dll 和任何資料庫知識,但我選擇了要將其包含在本示例中演示的目的。 MaxLength、 MinLength 和列屬性在同一命名空間作為驗證 (System.ComponentModel.DataAnnotations),但他們是 EntityFramework 程式集的一部分。

此外值得注意的域類是有求使用枚舉的兩個屬性:Tweeter.Experience,依靠其值的字串,其中,Tweet.Rating,它使用一個數位值。 它是開發人員,對這些類編碼以確保使用者有正確的值提供給他們。 為什麼沒有枚舉嗎? 由於核心.net 框架 4 中的實體框架 API 不支援枚舉。 但因為這是實體框架的大多數請求功能和現在是.net 框架 4.5 的一部分 (和支援的代碼中的第一個 EF 5),可以使用。 所以讓我們更新的解決方案。

雖然我已經在 Visual Studio 2012 鋼筋混凝土中打開我的解決方案,但它仍然針對.net 4。 我必須做的第一件事是我到.net 4.5,我可以在每個專案的屬性視窗中的三個專案的目標 (請參見圖 3)。 你要做這一個在一段時間,所以如果你有很多專案可能要使用腳本來對專案檔案直接運行。

Changing a .NET Framework 4 Project to .NET Framework 4.5
圖 3 的.net 框架 4 專案改為.net 框架 4.5

它是重要的是要更新到 EF 5 之前執行此步驟。 我知道這痛苦的滋味,不久將會解釋為什麼這是。

一旦這些專案針對.net 框架 4.5,您可以升級到 EF 5。 由於多個專案使用此程式集,您會想要一次管理整個解決方案,而不是更新一個專案的套裝軟體。 管理 NuGet 包是可從解決方案資源管理器中的解決方案的內容功能表。 這將打開的套裝軟體管理器使用者介面。 在左側,選擇更新。 在中間窗格中,如果您擁有當前版本的套裝軟體管理器中,您將看到帶有選項只有穩定和包括搶鮮的下拉清單。 如果像我一樣,你這樣做完全釋放異構 4.5 和 EF 5 之前, 你需要選擇包括搶鮮。 在我特定的解決方案中,EntityFramework 是唯一的包,需要更新這就是什麼出現了,因為你可以看到在圖 4。 如果你工作在套裝軟體管理器主控台中的風扇,您可以鍵入"安裝套裝軟體 EntityFramework –prerelease,"但是你必須為此分別為每個專案。

Finding the Entity Framework 5 Prerelease Update
圖 4 查找實體框架 5 搶鮮更新

從嚮導,一旦觸發該套裝軟體更新,NuGet 會詢問您要更新的專案。 即使我的專案的所有三個使用實體框架 4.3.1,我才要更新的 ConsoleApplication 和 DataLayer,所以我會取消選擇 DomainClasses。 你可以看狀態框中,因為它告訴你甚麼步驟考慮。 更新完成時,只關閉的套裝軟體管理器。

一個包,兩個 Dll

更新 EF 5 到受影響幾種方法這兩個的專案。 第一,它取代 4.3.1 EntityFramework.dll 5 的版本。 您應該驗證此中所有更新的專案。 這說明為什麼重要要切換到.net 框架 4.5 之前執行包更新這一步。 EF 5 包中包含兩個 Dll。 其中一個是版本 5,其中包含所有的 DbCoNtext API 和代碼第一次的特徵及與.net 4.5 相容。 其他的檔是版本 4.4。 這是保持與.net 4 相容。 通過在包中包括此 DLL,團隊就避免了需要維持兩個單獨的 NuGet 包,你不用擔心。 EF 5 發佈後,您就會安裝相同的 EF 5 包,每當您想 DbCoNtext 或代碼的第一個支援。 包將會照顧確保您已正確安裝在您的專案中的版本 — — 該專案是否是.net 4 或.net 4.5。

我做了此更新,第一次我沒 EF 更新前到.net 4.5 升級我的專案。 我找不到工作的新的功能,非常混亂。 然後我注意到 EntityFramework.dll 的版本是 4.4,這使我更加感到困惑。 最終,我流覽到該解決方案中的套裝軟體檔,看到我有兩個包,並理解我的錯誤。

EF 5 更新也修改主控台專案中的 app.config 檔,DataLayer 專案中創建 app.config 檔。 因為我原來的解決方案可以讓代碼第一種自動檢測相關資料庫使用其預設行為,我有沒有連接字串或連接工廠資訊設定檔中。 EF 5 安裝添加到 <entityFramework> 的下一節 檔的部分:

<defaultConnectionFactory
  type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
  <parameters>
    <parameter
       value="Data Source=(localdb)\v11; Integrated Security=True;
              MultipleActiveResultSets=True" />
  </parameters>
</defaultConnectionFactory>

此外,它會更新 app.config 的引用 EF 的程式集,以反映新的版本號。

有沒有設定檔的專案將得到新 app.config EF 5 預設配置。 這就是為什麼在更新後的 DataLayer 專案已 app.config。 但我不需要一個設定檔中的專案,所以我只會刪除該檔。

DomainClasses 專案呢?

更新時,我被跳過的域類的專案。 我需要在我的以前版本中 EntityFramework.dll 的唯一原因是解決方案的有權訪問的是解決方案的特定于 EF 的資料說明。 那些現在已經移到.net 框架 4.5 大會,System.ComponentModel.DataAnnotations.dll,加入其他資料批註。 所以我不再需要為引用 EF 從該專案。 事實上,我現在可以從該專案卸載 EntityFramework 參考。 而不是使用的套裝軟體管理器使用者介面,我更喜歡套裝軟體管理器主控台視窗打開,確保我瞄準的 DomainClasses 專案,然後鍵入"卸載套裝軟體 entityframework"以從該專案中刪除的套裝軟體。

但是有一步。 用類打開檔揭示了我專注于我的三個數據批註的編譯器警告。 原來,他們是作為 EntityFramework.dll System.ComponentModel.DataAnnotations 命名空間中。 但他們現在居住的.net 程式集,它們已經移動到的子命名空間。 所以我需要添加更多的人使用語句的代碼檔的頂部:

using System.ComponentModel.DataAnnotations.Schema;

這,編譯器是快樂,所以我,因為我已經無事可做與資料訪問的類中刪除對實體框架的依賴。 仍然有個人厭惡放在我的域類中定義的資料庫架構和一般傾向于實體框架流利的 API 配置為這些任務的屬性。 然而,在小型專案中,我發現資料批註,以方便、 快速的使用。

穿越版本

EF 團隊目標的.net 框架 4.5 已覆蓋您安裝的 EF 4.3.x 到專案的可能性。 如果執行此操作 (無論是有意或無意)、 文本的檔將顯示在 IDE 中,列出了使用 EF 4.x.net 4.5 專案中的已知的問題,並建議安裝 EF 5。 一旦 EF 5 變得穩定,並且是缺省包,開發者犯這個錯誤的可能性應該會消失。

切換到枚舉,耶 !

與所有這些地方都可以修改我的域班要擺脫醜陋的解決方法,使用等級和經驗的屬性的枚舉。 這裡有兩個新的枚舉,並注意到我指定之一,但沒有其他的值,因此您可以看到 EF 如何處理這兩種情況:

public enum TweetRating
{
  Suxorz = 0,
  WorksForMe = 1,
  WatchOutAPlusK = 2
}
public enum TwitterExperience
{
  Newbie, BeenAround, Ninja
}

與地方枚舉,我可以,如下所示修改的屬性:

[Column("ExperienceCode")]
public TwitterExperience Experience { get; set; }
[Column("RatingCode")]
public TweetRating Rating { get; set; }

請注意我不再需要的屬性以指定的屬性範圍或長度。 更重要的是,要知道我在我的演示資料庫中作出此更改,而不考慮可能的現有資料。 如果您想要更改了像這到是在生產中的應用程式,您需要預先準備的資料更改。 我完全改變的意義的經驗在資料庫中,我還隨機改變的 tweet 評級範圍從 1 5 0-2。

使用代碼第一次遷移來更新資料庫後, 的 Tweeter.ExperienceCode 列已從更改 Nvarchar 資料類型為 int。 C# 和 Visual Basic 會解釋該枚舉為整數,預設情況下,將開始用 0 枚舉。 因此,代碼第一次將映射的枚舉值為 int 資料類型在資料庫中。 您可以指定該枚舉是不同類型 (C# 和 Visual Basic 枚舉的範圍),代碼第一次將會尊重你的意見。 例如,只要定義枚舉將導致將映射到一個 Bigint 資料類型的屬性。 但是,預設情況下,你總是會獲得從 0 開始的整數。 在我的示例中,在資料庫中,將由 0,不活躍的 1 和 2 的忍者表示新手。 如果你覺得有任何機會,在將來,您可能希望刪除的任何枚舉成員,將它們重新排序或添加新的而不是結束時,您應顯式值分配給他們 TweetRating 枚舉的一樣。 這便於更改枚舉而不更改這些值的任何意外。 別忘了資料庫將存儲的數值,所以如果您的最終更改枚舉,這會有效地中的值更改您的資料的含義 ... ... 這是幾乎總是,正如 C# 大師 Jon 歉說:"不好的事"。

圖 5 顯示創建新推兩個枚舉和高音單元實例的代碼。 保存此資料後, 資料庫顯示 ExperienceCode 的值等於 1 和評級等於 2。

圖 5 創建的一台高音喇叭和推新圖表

var alias = new Tweeter
  {
    Name = "Julie",
    UserName = "Julie",
    Bio = "Mom of Giantpuppy",
    CreateDate = DateTime.Now,
    Experience = TwitterExperience.BeenAround,
    Tweets = new List<Tweet>{new Tweet
               {
                 Content = "Oh how I love that Giantpuppy",
                 CreateDate = DateTime.Now,
                 Rating = TweetRating.WatchOutAPlusK
               }}
  };

您可以在查詢中,使用枚舉並會照顧實體框架轉換為 int 值的 SQL 中枚舉和轉換回枚舉值返回的 int 值。 例如,這裡是在哪裡使用 enum 的 LINQ 查詢謂詞:

context.Tweeters.Where(t => t.Experience == 
  TwitterExperience.Ninja)

在生成 T-SQL 中,Where 謂詞的值為 2。

平滑移動到 EF 5

我已聽到表達渴望以便從枚舉和空間資料的支援中獲益的埠 EF 5 到其現有的實體框架解決方案的開發人員。EF 5 到從 EF 4 獲取這些專案可能不是火箭科學,但有足夠坎坷發現有點煩人的頭幾次的過渡。我希望此列便於您進行移動。

我喜歡單 NuGet 套裝軟體中的代碼第一次和 DbCoNtext 支援.net 4 和.net 4.5 提供相容的 Dll 的事實。即使我用 EDMX,仍然啟動所有新專案的 DbCoNtext,和我的專案 100%因此現在依靠實體框架 NuGet 套裝軟體。

請記住 EF 4 應用程式運行的電腦上安裝.net 框架 4.5 將受益于改進性能,因此,即使如果你沒有獲得相當尚未移動到 Visual Studio 2012,您的使用者仍然能感覺到.net 框架 4.5 的實體框架核心改進的愛的一些。

Julie Lerman 是 Microsoft MVP,.net 的導師和顧問住在佛蒙特州的丘陵。您可以找到她介紹資料訪問和使用者組和世界各地的會議其他 Microsoft.net 主題。在她博客 thedatafarm.com/blog 和的作者是"程式設計實體框架"(2010 年) (2011 年) 的代碼第一版和 DbCoNtext 版 (到 2012 年),所有從 O'Reilly 媒體。跟她在 Twitter 上 twitter.com/julielerman

由於下面的技術專家,檢討這篇文章:亞瑟 · 維克斯