この記事は機械翻訳されたものです。

データ ポイント

既存のプロジェクトを EF 5 に移行する (機械翻訳)

Julie Lerman

 

Julie Lermanマイクロソフトへの変更の間で多数の修正および改良コア Entity Framework Api を .NET Framework 4.5。 最も顕著なのエンティティ フレームワーク、LINQ to Entities クエリに自動的に、それを繰り返し使用する場合、クエリを SQL に変換のパフォーマンス コストを削除するキャッシュの新しい方法です。 この機能は Auto-Compiled クエリとして呼ばれ、チームのブログの記事でそれについての詳細、およびその他のパフォーマンスの向上を読むことができます"スニーク プレビュー。エンティティ フレームワーク 5 パフォーマンスの向上」で bit.ly/zlx21L。 この機能のボーナスは、エンティティ フレームワークを使用しても .NET 4 アプリケーションは、「無料」マシン with.NET 4.5 のインストールを実行するとご利用いただけますので、エンティティ フレームワーク API は .NET フレームワーク 4.5 内によって制御されますです。

コア API に建てられたその他の便利な新機能は、あなたの部分は、列挙型、空間データ型およびテーブル値関数のサポートなど、いくつかのコーディングが必要です。 Visual Studio 2012 エンティティ データ モデル (EDM) のデザイナーは、いくつかの新機能にも、モデルの異なるビューを作成する機能などがあります。

ほとんどの私の EF 関連 dbcontext クラスの API は、コードの最初の機能に加えて、個別に .NET Framework から提供を使用これらの日コーディングを行います。 これらの機能のより流動的と頻繁に、エンティティ フレームワークを強化マイクロソフトの方法、経由で NuGet プロジェクトにインストールすることができる EntityFramework.dll という名前の単一のライブラリに含まれています。

列挙型のサポート、.NET Framework 4.5 で EF を追加その他の機能を活用するには、互換性のあるバージョンの EF 5 EntityFramework.dll 必要があります。 このパッケージの最初のリリース バージョン番号 5 を持っています。

4.3.1 EF を使用するアプリケーションがたくさんをあります。 このバージョンには、EF 4.3 プラスの直後後に追加されたいくつかのマイナーな心痛の導入移行のサポートが含まれます。 このコラムでは EF 4.3.1 EF 5 を使用して .NET 4.5 に列挙型の新しいサポートを活用するアプリケーションを移動する方法場合が表示されます。 これらの手順は、EF 4.1、4.2 または 4.3 を使用しているプロジェクトにも適用されます。

DomainClasses は、の別の DataLayer はコンソール アプリケーションである 1 つのプロジェクトがある単純なデモ製品ソリューションを始めます図 1

The Existing Solution That Uses EF 4.3.1
図 1 EF 4.3.1 を使用して、既存のソリューション

このソリューションは .NET Framework 4 と EF 4.3.1 を使用して Visual Studio 2010 で建てられた EntityFramework.dll のバージョン。

DomainClasses プロジェクトに詰め物を示す、単一のファイルに 2 つのクラスが図 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; }
  }
}

このプロジェクト データ注釈だけ (正規表現) などの検証を追加するが、またいくつかの構成を定義するを使用 — MaxLength、最小長、列。 最後の列をデータベース テーブルには列の名前を指定、フィールド経験と評価マップ。

すべての 3 つのプロジェクトは、EntityFramework.dll (バージョン 4.3.1) 参照します。 通常、私は私のドメイン クラスから、EntityFramework.dll と任意のデータベースの知識を維持が実証の目的のためこの例ではそれを含めることを選びました。 MaxLength、最小長の列の属性 (System.ComponentModel.DataAnnotations) の検証と同じ名前空間ですが、彼ら EntityFramework アセンブリの一部。

またドメイン クラスの著しい請う列挙型を使用する 2 つのプロパティを持っているという事実です。Tweeter.Experience は、その値を文字列に傾いていると Tweet.Rating は、数値の値を使用します。 ユーザーがそれらに使用できる適切な値であることを確認するこれらのクラスをコーディングする開発者です。 ない列挙型、なぜですか? コア エンティティ フレームワーク API は .NET Framework 4 では列挙型をサポートしていないため。 しかし、このエンティティ フレームワークの最も要求される機能と .NET Framework 4.5 の一部になります (EF 5 で最初のコードによってサポートされているので)、それを使用することができます。 それでは、ソリューションを更新します。

2012 RC と Visual Studio ソリューションを開いたが、それはまだ .NET 4 を狙っています。 .NET 4.5、各プロジェクトの [プロパティ] ウィンドウでを行うことがでく 3 つのプロジェクトを対象とする必要がありますを行うまず最初です (を参照してください図 3)。 あなたは多くのプロジェクトがある場合は、スクリプトを使用してプロジェクト ファイルに対して直接実行することがこの時に、1 つを行う必要があります。

Changing a .NET Framework 4 Project to .NET Framework 4.5
図 3 .NET Framework 4.5 .NET フレームワーク 4 プロジェクトの変更

EF の 5 を更新する前にこの手順を行うことが重要です。 これは堅い方法を学んだし、この理由をすぐに説明します。

プロジェクトが .NET Framework 4.5 を狙っているに EF 5 をアップグレードできます。 複数のプロジェクトはこのアセンブリを使用するため、ソリューション全体ではなく、更新の 1 つのプロジェクトのためのパッケージを同時に管理します。 管理する NuGet パッケージがソリューション エクスプ ローラーで、ソリューションのコンテキスト メニューから利用可能です。 これは、パッケージ マネージャー UI を開きます。 左側には、更新プログラムを選択します。 中央のウィンドウでのパッケージ マネージャーは、現在のバージョンがある場合がありますプレリリースと安定しただけのオプションのドロップ ダウン ボックスが表示されます。 私のように、これをやっているかどうかは、完全なリリース of.NET 4.5 と EF 5 に先立って、プレリリースを含めるを選択する必要があります。 特定のソリューションでは、EntityFramework で見ることができますようには何が出ているので更新が必要な唯一のパッケージです図 4。 パッケージ マネージャー コンソールで作業してのファンしている場合は、"インストール パッケージ EntityFramework –prerelease"で入力できますが、これをプロジェクトごとに個別に行う必要があります。

Finding the Entity Framework 5 Prerelease Update
図 4 エンティティ フレームワーク 5 を見つけるのプレリリース版更新します。

パッケージの更新をトリガー一度ウィザードからは、NuGet を更新するプロジェクトを求めます。 エンティティ フレームワーク 4.3.1 の私のプロジェクトのすべての 3 つの使用も、私だけは DomainClasses の選択を解除しますので ConsoleApplication、DataLayer は、更新するつもりです。 それはあなたを指示それがステップとしてステータス ボックスを見ることができますを取っています。 更新が完了すると、パッケージ マネージャーを閉じます。

2 つの Dll の 1 つのパッケージ

EF の 5 を更新する 2 つのプロジェクトはいくつかの方法で影響を受けます。 最初に、それは 4.3.1 置き換え EntityFramework.dll のバージョン 5 で。 これは、更新プロジェクトのすべての確認する必要があります。 4.5 パッケージの更新の手順を実行する前に .NET Framework に切り替えるには重要である理由を示します。 EF 5 パッケージに 2 つの Dll が含まれています。 DbContext API とコードの最初の機能のすべてを含む、.NET 4.5 と互換性があるバージョン 5 では 1 つです。 その他のファイルは、バージョン 4.4 です。 これは互換性のある .NET 4 のままになります 1 つです。 この DLL をパッケージに含めることで、チームを心配する 2 つの独立した NuGet パッケージを維持する必要を避けます。 EF の 5 をリリース後、dbcontext クラスまたはコードの最初のサポートをするたびに同じ EF 5 パッケージをインストールします。 パッケージをプロジェクトにインストールされている、正しいバージョンがあることの世話をする — プロジェクト .NET 4 または .NET 4.5 であるかどうか。

この更新プログラムをしたの初めて、EF の更新前に私のプロジェクトを .NET 4.5 にアップグレードしていなかった。 新しい機能を得ることができなかったし、非常に混乱していた。 その後 EntityFramework.dll のバージョン 4.4 は、私はもっと混乱したということに気づいた。 最終的には、ソリューション内のパッケージ ファイルを参照し、私は 2 つのパッケージを持っていたし、私のミスを理解を見た。

EF 5 更新はまたコンソール プロジェクトの app.config ファイルを変更し、DataLayer プロジェクトの app.config ファイルを作成します。 私の元のソリューションは、最初のコード関連のデータベースを自動的に検出するため、その既定の動作を使用できるため、私の接続文字列または接続ファクトリ情報 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>

さらに、新しいバージョン番号を反映する EF アセンブリへの参照を app.config の更新。

設定ファイルがプロジェクトは、新しい app.config EF 5 の既定の構成を取得しません。 だからこそ DataLayer プロジェクトには app.config 更新後があります。 しかし、私はちょうどそのファイルを削除しますので、そのプロジェクト内の構成ファイルを必要としません。

DomainClasses プロジェクトについての何か。

更新時に、ドメインのクラスのプロジェクトをスキップします。 私の解決策の以前のバージョンの EntityFramework.dll に必要な唯一の理由は EF に特定されたデータ注釈へのアクセスを持っていた。 それらの今、.NET フレームワーク 4.5 のアセンブリ、System.ComponentModel.DataAnnotations.dll、データ注釈に参加する移動されました。 だからそのプロジェクトからもはや参照 EF 必要。 実際には、今からそのプロジェクトの EntityFramework 参照をアンインストールできます。 パッケージ マネージャー UI を使用してではなく、私を好むパッケージ マネージャー コンソール ウィンドウを開いては DomainClasses プロジェクトのターゲットだし、そのプロジェクトからパッケージを削除する"アンインストール パッケージ entityframework"を入力ことを確認してください。

しかし、1 つ以上のステップがあります。 クラスとファイルを開くに焦点を当てている 3 つのデータ注釈のためのコンパイラ警告を明らかにします。 もともと、彼らは EntityFramework.dll の一部として、System.ComponentModel.DataAnnotations 名前空間であった。 しかし、彼らが今住んで .NET アセンブリでは、彼らをサブ名前空間に移動しました。 私は 1 つ以上追加する必要があるので、コード ファイルの先頭にステートメントを使用します。

using System.ComponentModel.DataAnnotations.Schema;

これにより、コンパイラは幸せです、データ アクセスには何の関係も持つクラス Entity Framework の依存を削除したので、私もでしょう。 私はまだ個人的な嫌悪をドメイン クラスでデータベース スキーマを定義し、エンティティ フレームワークの fluent API の構成これらのタスクを一般的に傾く属性を置くことがあります。 しかし、小さなプロジェクトでは、私は便利で使用する簡単にデータ注釈を見つけます。

交差点のバージョン

EF チーム プロジェクトに、インストールの EF 4.3.x の可能性をターゲット .NET Framework 4.5 をカバーしています。 場合これを行うかどうかを (意図的または誤って)、テキスト ファイルは、EF 4.x 4.5 .NET プロジェクトでの使用に関する既知の問題の一覧や、EF 5 のインストールをお勧めします IDE で表示されます。 EF 5 安定になるデフォルトのパッケージと、開発者はこの間違いを犯す可能性が消えるはずです。

イェーイ列挙型への切り替えだ !

この場所のすべての醜いの回避策を取り除く評価と経験のプロパティを列挙型を使用してドメイン クラスを変更できます。 ここでは、2 つ新しい列挙型と EF 両方のシナリオを処理する方法を見ることができるので私は 1 つではなく他の値を指定するメモを取る。

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; }

長さまたはプロパティの範囲を指定する属性もはや必要に注意してください。 もっと重要な私は私のデモ データベースにこの変更可能な既存のデータに関係なくを作っています注意してください。 このような生産は、アプリケーションに変更する場合、データの変更に対して事前に準備する必要があります。 私は完全にデータベースでの経験の意味を変えているし、私はまたランダムにさえずる評価の範囲 1-5 から 0-2 に変更しました。

最初のコードの移行を使用してデータベースを更新する後、Tweeter.ExperienceCode 列、nvarchar データ型から int に変更されています。 C# および Visual Basic 列挙型は既定では整数として解釈し、0 の列挙を開始します。 したがって、コードの最初の列挙値 int データ型のデータベースにマップします。 最初のコードは、尊重しては異なる型 (c# および Visual Basic の列挙型の境界) 内で列挙型を指定できます。 たとえば、限り、列挙型の定義を bigint データ型にマップされるプロパティになります。 しかし、既定で常に 0 から始まる整数を取得します。 私の例では、データベース内で初心者 0、1 で世間を知りません、忍者 2 によって表されます。 将来の任意の列挙型のメンバーを削除する可能性があります任意のチャンスがあると思う場合は、それらを並べ替えるまたは TweetRating 列挙体での同様終わりには、明示的な値をそれらの割り当てる必要があります他のよりも新しいものを追加します。 誤ってこれらの値のいずれかを変更せず、enum を変更するやすくなります。 データベースは数値のみを格納、あなたは効果的には、列挙値を変更するのに終わるか、のであなたのデータの意味を変更ことを忘れないでください. c# の第一人者ジョン スキート射撃を言うように、「悪いこと」はほとんど常にです

図 5 と一緒に、列挙型を使用してさえずり、新しいツィーター インスタンスを作成するコードを示しています。 このデータを保存した後、データベース、ExperienceCode の値 2 に等しい 1 と評価に等しい示します。

図 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
               }}
  };

クエリでは、列挙を使用して Entity Framework enum を int 値 SQL に変換して、enum 値に戻って返される int 値への変換の世話をします。 たとえば、ここではどこで enum を使用して LINQ クエリ述語。

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

その結果 T SQL の Where 述語値は 2 です。

EF 5 へのスムーズな移動

私はすでに開発者は既存のエンティティ フレームワーク ソリューションに EF 5 ポート列挙型と空間データのサポートを受けるためには熱意を表現を聞いています。 それらのプロジェクトから EF 4 EF 5 を取得ロケット科学が十分な最初の数回は少し迷惑な遷移を見つけたことは道路のバンプがあった。 この列の移動を行うに簡単に願っています。

コード最初、DbContext のサポートのための単一の NuGet パッケージ互換性 Dll .NET 4 と .NET 4.5 の両方を提供することが好き。 私は EDMX を使用している場合でも、まだ dbcontext クラスとすべての新しいプロジェクトを起動、したがって私のプロジェクトの 100 % 今エンティティ フレームワーク NuGet パッケージに依存します。

EF 4 アプリを実行してコンピューターに .NET Framework がインストールされて 4.5 とパフォーマンスの向上から、そうであっても Visual Studio 2012 にはかなりまだ移動を取得しない場合、ユーザーまだいくつかのエンティティ フレームワークのコア .NET Framework 4.5 での改善の愛を感じることができる利益になることに注意してください。

Julie Lerman Microsoft MVP、.NET のメンターとバーモント州の丘に住んでいるコンサルタントです。 世界中のユーザー グループやカンファレンスで、データ アクセスなどの Microsoft .NET トピックについてプレゼンテーションを行っています。 彼女はブログで thedatafarm.com/blog 、「Entity Framework のプログラミング」の著者 (2010) コードの最初のエディション (2011) DbContext 版 (2012 年) だけでなく、オライリー メディアからすべてあり。 彼女は Twitter 上で従う twitter.com/julielerman

この記事のレビュー、次技術専門家のおかげで:アーサー ・ ビッカース