Entity Frameworkのコードファースト



.NETには、Microsoftが開発およびサポートする2つのネイティブORM、Entity FrameworkとLinq2Sqlがあります。 ただし、Entity Frameworkは目覚しいペースで成長を続けており、Linq2Sqlの将来については実際には何もわかっていません。



Entity Frameworkは、便利なデザイナー、膨大な数のマッピングオプション、モデルクラスの自動生成を提供しますが、これらすべてに大きなマイナスがあります-デザイナーでモデルを変更するたびに、すべてが再作成されるため、巨大で肥大化した生成クラスも手動で変更できません。 これをLinq2Sqlのように純粋なクラスとそれらに追加された属性と比較すると、多くの人がLinq2Sqlの軽さとEFの極悪さを主張する理由を理解できます。



もちろん、すべての問題には解決策があり、これも例外ではありません。 部分クラスを使用すると、必要な機能を追加できます。[MetadataType]属性でマークされた検証ルールで特別に作成されたクラスにより、モデルクラスの検証属性を使用できるようになります。 しかし、全体としてはあまり美しくありません。クラスがプロジェクト全体に広がり、その数が増え、サポートの複雑さがすべて同じになります。



モデルクラスの動作条件を忘れないでください。これらは、EntityObjectを継承するか、EntityWithKey、IEntityWithChangeTracker、およびIEntityWithRelationshipsインターフェイスを実装する必要があります。



それでは、ORM内で作業するための最も単純なクラスを取得したい人のために何をすべきでしょうか?



ROSOとコードファースト


初めて、ROSO(Plain Old CLR Objects)のサポート、つまりモデルと同様に単純なクラスでの作業がEF 4で登場しました。



ご注意


Visual Studio SP1でサポートが宣言されているにもかかわらず、 SQL Server Compact 4およびEF Code First Packageを正常に動作させるためにVisual Studio Toolsをインストールする必要がありました



たとえば、ここにクラスがあります

public class Author { public int AuthorID { get; set; } public string Email { get; set; } public string Name { get; set; } }
      
      





完全に機能するエンティティ「作成者」について説明します。基本クラス、インターフェイス、属性、メタデータは必要ありません。



最も単純なエントリポイントは次のようになります。

 public class Library : DbContext { public DbSet<Author> Authors { get; set; } }
      
      





そしてそれだけです! Libraryオブジェクトを作成した直後に、EFのすべての利点を使用して操作できます。



Code-Firstは、Model-FirstおよびDatabase-Firstと並んで新しい機能です。 これで、最初にモデルクラスを記述するコードを記述でき、フレームワークはこのコードを使用してデータベースを自動的に作成します。

最良の部分は、関係のタイプが認識されることです。1:1のオブジェクト参照を定義するだけで、1:n関係のICollectionと、m:nの相互ICollectionを定義します。 この場合、ステージングテーブルも自動的に作成されます。 遅延読み込みを保証するには、プロパティ定義でvirtualキーワードで十分です。



System.ComponentModel.DataAnnotations



名前空間の属性も完全にサポートされています。



主なものは次のとおりです。

•[Key]-このプロパティがキーになることを示します。

•[NotMapped]-データベースの列にプロパティを表示しません。

•[Column(“ columnName”、TypeName =” typeName”]-フィールドとその型がマップされるデータベースの列を示します。クラスに、たとえば画像を格納するタイプbyte []のプロパティがあり、データベースに表示される場合に便利です。特別なタイプの画像。

UPDただし、この方法で型のサブセットを指定することはできません。たとえば、文字列の場合、デフォルトではデータベースで型nvarchar(MAX)が選択され、この属性ではnvarchar(30)フィールドの長さを明示的に指定できません

•データ検証を提供する[MinLength]、[MaxLength]、[Required]など



Code-Firstは、SQL Server CE 4.0の新しいバージョンで動作するように調整されています。 このデータベースのサポートはMVC3に含まれており、一部の人々はすでに標準のSQL Expressではなく、そのようなデータベースを使用するようにサイトを切り替えています。



デフォルトでは、データベースジェネレーターは、SQL Expressデータベースの作成を試みます。失敗した場合は、SQL Server CE この動作はapp.configで簡単にオーバーライドされます

  <connectionStrings> <add name="Library" connectionString="Data Source=Library.sdf" providerName="System.Data.SqlServerCe.4.0"/> </connectionStrings>
      
      





接続文字列の名前は、アクセスポイントクラス(DbContext)の名前と一致する必要があることに注意してください。



データベースを作成するための戦略(プライマリ生成または更新)を定義することもできます。 すべての戦略は、IDatabaseInitializerインターフェースを実装するクラスです。 プログラムのアクティブな開発期間中にデータベースにデータを入力して、戦略を決定できます。

定義済みの戦略は、CreateDatabaseIfNotExists(存在しない場合はデータベースを作成)、DropCreateDatabaseAlways(データベースは常に削除および再作成されます)、DropCreateDatabaseIfModelChanges(モデルに変更が加えられたときに再作成されます)です



データベース呼び出しで作業するための戦略は変化しています

Database.SetInitializer(新しいDropCreateDatabaseAlways());



データベースを作成するとき、フレームワークは別のサービステーブルEdmMetadataを作成します。これには、作成時のモデルのハッシュが格納されます。 これはデータベースとクラスの積極的な開発には不便ですが、解決策があります-DbContextクラスのOnModelCreatingメソッドをオーバーロードします。

  protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); }
      
      







一般的に、コンベンションは非常に強力なものです。 これらを使用すると、さまざまな記号に基づいてデータベースのプロパティの表示を構成したり、ネームスペースを有効/無効にしたりできます。 それらの詳細については、 こちらをご覧ください。



Code-Firstは、モデルコードを最も便利な方法で管理するための多くのオプションを提供します。 特に小さなプロジェクトやモバイルデバイス(はい、SQL Server CE 4.0はWindows Phone Mangoでサポートされます)の場合、このアプローチは可能な限り正当化されると思います。



All Articles