Entity Framework (SQL Server Compact)

Entity Framework は、データ指向ソフトウェア アプリケーションの開発をサポートする ADO.NET の一連のテクノロジです。Entity Framework を使用すると、ドメイン固有のオブジェクトやプロパティの形式のデータ (顧客や顧客の住所など) を操作することができます。そのデータが格納されている、基になるデータベースのテーブルや列のことを気にする必要はありません。

Entity Framework では、より高度な抽象化レベルでデータを操作できるため、特定のデータ ストレージ エンジンやリレーショナル スキーマに依存しないコードを作成できます。開発者は、直接リレーショナル ストレージ スキーマに対してプログラミングを行うのではなく、アプリケーションの概念モデルに対してプログラミングを行うことによってデータ アクセス アプリケーションを作成できます。

Entity Framework のアプリケーションとサービスは、概念モデル、ストレージ モデル、およびこの 2 つのマッピングによって構成されます。既存のデータベースからエンティティ データ モデル (EDM) を抽出したいという開発者のニーズに応えるために、Entity Framework には、EDM を生成および検証したり、概念モデルに基づいてプログラミング可能なクラスを作成したりする一連のツールが用意されています。

ADO.NET は、EDM を通じてエンティティを .NET 環境のオブジェクトとして公開します。これにより、オブジェクト層が統合言語クエリ (LINQ) サポートの理想的なターゲットになります。LINQ to Entities では、開発環境で LINQ の式と標準クエリ演算子を直接使用することにより、Entity Framework オブジェクト コンテキストに対して柔軟で厳密に型指定されたクエリを作成できるようになります。Entity Framework と LINQ to Entities の詳細については、「Entity Framework」を参照してください。

SQL Server Compact では、SQL Server Compact 4.0 以降の Web アプリケーション プラットフォームで Entity Framework がサポートされています。

SQL Server Compact における Entity Framework

SQL Server Compact 4.0 で Entity Framework を使用するには、まず Entity Framework をインストールします。Entity Framework は、.NET Framework 4 のコンポーネントです。

SQL Server Compact 4.0 の開発サポートは Visual Studio 2010 Service Pack 1 で提供されます。Visual Studio 2010 Service Pack 1 における Entity Framework に対する Entity Data Model Designer のサポートは、Entity Framework Tools で提供されます。Entity Data Model Designer (エンティティ デザイナー) は、Visual Studio 2008 Service Pack 1 (SP1) 以降の Visual Studio のコンポーネントで、エンティティ データ モデル (EDM) の作成や編集に使用されるビジュアル ツールです。このツールの詳細については、「Entity Framework」を参照してください。

SQL Server Compact 4.0 リリースでは、SQL Server Compact に System.Data.SQLServerCe.Entity.dll というマネージ アセンブリが用意されています。System.Data.SQLServerCe.Entity.dll アセンブリは、ADO.NET マネージ データ プロバイダーの System.Data.SqlServerCE.dll によって内部で使用され、Entity Data Model (EDM) に記述されているデータへのアクセスをサポートします。

SQL Server Compact (SSCERuntime-ENU.msi) の SQL Server Compact 4.0 以降のリリースをインストールすると、System.Data.SQLServerCe.Entity.dll が %ProgramFiles%\Microsoft SQL Server Compact Edition\v4.0 フォルダーにインストールされます。

注意

SQL Server Compact 4.0 は、.NET Framework 4 の Entity Framework 4 でのみ使用できます。SQL Server Compact 4.0 は .NET Framework 3.5 をサポートしておらず、エラーをスローします。

Code First / Code Only

SQL Server Compact 4.0 は、ADO.NET Entity Framework 4 の Code First プログラミング モデルをサポートしています。Entity Framework Web アプリケーションを作成するには、Database FirstModel First の 2 つの方法があります。Model First は、ADO.NET Entity Framework 4 (.NET Framework 4) の新機能であり、Code First / Code Only 開発として知られる開発よりもコード中心の開発ワークフローを可能にします。このワークフローでは、コードモデルになります。Code First プログラミング モデルは次のように機能します。

  • Code Only を使用するには、いくつかの POCO (Plain Old CLR Object) クラスを作成する必要があります。これらは主にコンストラクターで構成されます。

  • 次の手順では、ObjectContext から派生したクラスを記述して、モデルの図形と POCO クラスにアクセスする方法を指示します。これは Entity Framework 対応のクラスです。

この段階で、CLR に関するすべての用意ができましたが、EDMX ファイルに保存されている Entity Framework メタデータがなければ ObjectContext クラスを使用することはできません。Code Only では、この EDMX ファイルがありません。

  • メタデータを使用するには、ContextBuilder で SqlConnection を定義する必要があります。ContextBuilder は、ObjectContext のプロパティをすべてスキャンし、名前付け規則に従って既定の概念モデル、ストレージ モデル、およびマッピングを推論します。次に、ContextBuilder を介して渡したメタデータと SqlConnection を使用して、EntityConnection を作成します。

  • その後、POCO クラスで作成されたコンストラクターに EntityConnection を渡すことによって、ObjectContext のインスタンスが作成されます。

  • コンテキストのインスタンスが作成されると、次のような場合に多くの拡張メソッドを使用できます。

    1. データベース スクリプトを自動的に作成する。

    2. データベースが存在するかどうかを確認する。

    3. データベースを作成する。

    4. データベースを削除する、など。

名前付け規則を使用しないで、オーバーライドすることもできます。Entity Framework 4 では、ContextBuilder は ModelBuilder と DbModel に分解されます。

ダウンロードするには、「ADO.NET Entity Framework 4」を参照してください。

SQL Server Compact の制限

SQL Server Compact を Entity Framework と共に使用する場合、以下の制限事項があります。

  • SQL Server Compact 4.0 では、Entity Framework と共に使用し、キーの種類が ID 列である場合にのみ、サーバーで生成されたキーや値を持つエンティティがサポートされます。

    Entity Framework を使用する場合、エンティティのキーを、サーバーで生成されるキーとしてマークできます。これにより、エンティティの挿入や作成時に、データベースがキーの値を生成することができます。さらに、エンティティの 0 個以上のプロパティが、サーバーで生成された値としてマークされます。詳細については、Entity Framework ドキュメントの「Store Generated Pattern」を参照してください。

    Entity Framework を使用すると、サーバーで生成されたキーや値を持つエンティティの種類を定義できます。ID という種類以外の、サーバーで生成された値を持つエンティティに対してデータ操作を実行すると、"サポートされていない" という内容の例外がスローされます。

  • SQL Server Compact スキーマで制約名が重複している場合、SQL Server Compact 4.0 の Entity Data Model の生成が失敗します。

    SQL Server Compact の場合、制約名はテーブル内で一意であるため、データベース内では制約名が重複することがあり得ます。この動作は SQL Server とは異なります。SQL Server の場合、制約名はデータベース全体で一意です。SQL Server Compact 4.0 スキーマで参照整合性 (主キーと外部キーのリレーションシップ) 制約名が重複している場合、ADO.NET Entity Framework の Entity Data Model ウィザードを使用した Entity Data Model の生成は失敗します。たとえば、テーブル名を制約名に加えるなどして、制約名がデータベース全体で常に一意になるようにしてください。

  • Entity SQL では完全外部結合がサポートされていますが、SQL Server Compact では、Entity Framework を使用する完全外部結合はサポートされません。たとえば、次のクエリはサポートされていません。

    Entity SQL:

    SELECT c.Name, c.Id, o.Id 
    FROM NW.Customers AS c 
    FULL OUTER JOIN NW.Orders AS o ON c.Id = o.CustomerId
    

    Entity Framework を使用する内部結合、左外部結合、および右外部結合はサポートされています。

  • SQL Server Compact では、Entity SQL クエリの ORDER BY 句における COLLATE サブ句の指定はサポートされていません。

    Entity SQL では、ORDER BY 句の各キーの一部に COLLATE サブ句を指定できます。COLLATE サブ句は文字列値の式にのみ使用でき、その式に使用する比較セマンティクスを決定します。

    SQL Server Compact では、Entity Framework と共に使用する場合、Entity SQL クエリの ORDER BY 句における COLLATE サブ句の使用はサポートされません。たとえば、次のクエリはサポートされていません。

    Entity SQL:

    SELECT value c 
    FROM NW.Customers AS c 
    ORDER BY c.Name COLLATE Traditional_Spanish_ci_ai 
    
  • SQL Server とは異なり、SQL Server Compact では、real、float、money、および numeric データ型での剰余演算子 (%) はサポートされません。

    SQL Server Compact で次のクエリを実行するとエラー メッセージが表示されます。

    Entity SQL:

    ( CAST ( 1 AS Edm.Int16) % CAST ( 1 AS Edm.Decimal) ) 
    

    Transact-SQL:

    SELECT cast (1 as smallint) %cast (1 as decimal(28,4)) 
    

    このようなクエリを実行すると、"剰余は real、float、money、および numeric データ型ではサポートされていません。[ Data type = numeric ]" というエラー メッセージが表示されます。

  • SQL Server Compact では、集計 (max、min、sum、count) における DISTINCT の使用はサポートされていません。

    集計 (max、min、sum、count) で DISTINCT を使用する Entity SQL クエリや Transact-SQL クエリを作成しようとすると、"サポートされていない" という内容の例外がスローされます。集計 count で DISTINCT を使用する Entity SQL クエリを次の例に示します。

    Entity SQL:

    SELECT count(distinct [TaskId]) FROM ArubaContainer.TaskSet AS [Task]
    
  • SQL Server Compact では、Entity Framework と共に使用する場合、コマンド タイムアウトはサポートされません。

    Entity Framework では、ObjectContext.QueryTimeout プロパティまたは EntityCommand.CommandTimeout プロパティを使用して、コマンド タイムアウトを指定できます。

    SQL Server Compact では、Entity Framework と共に使用する場合、コマンド タイムアウトはサポートされません。つまり、コマンド タイムアウトには 0 以外の値を設定しないでください。接続タイムアウト プロパティを設定すると、SQL Server Compact データベースから NotSupportedException(“CommandTimeout”) 例外がスローされます。

  • SQL Server Compact では、Unicode 文字列のみがサポートされます。

    Entity Framework では、Unicode 文字列と非 Unicode 文字列両方がサポートされています。SQL Server Compact では、Unicode 文字列のみがサポートされます。'String' 型のリテラル <literal> は、現在のプロバイダでサポートされていません。SQL Server Compact で非 Unicode 文字列を使用すると、"near constant literal" という内容の例外がスローされます。

  • SQL Server Compact では、ストアド プロシージャやビューはサポートされません。

SQL Server Compact データベースをデータ ソースとして使用する Entity Framework アプリケーションを作成する方法については、「エンティティ フレームワーク アプリケーションの作成 (SQL Server Compact)」を参照してください。

関連項目

その他の技術情報

マネージ アプリケーションの構築 (SQL Server Compact)