ADO.NET Entity Framework データ プロバイダー
ADO.NET Entity Framework は、.NET Framework 用のオブジェクト リレーショナル マッピング(ORM)フレームワークです。このフレームワークを使用すると、開発者はリレーショナル ストレージ スキーマに対して直接プログラミングするのではなく、概念アプリケーション モデルに対して行うことで、データ アクセス アプリケーションを作成できます。このモデルにより、データ中心のアプリケーションで書かれ、保守されるコードの量を減らすことができます。
Zen ADO.NET Entity Framework データ プロバイダー(以前の Pervasive ADO.NET Entity Framework データ プロバイダー)は、ADO.NET Entity Framework を使用するアプリケーションで使用できます。
Zen ADO.NET Entity Framework データ プロバイダーは、Microsoft ADO.NET Entity Framework のバージョン 5.0、6.0、6.1、6.1.1、および 6.1.2 と互換性があります。以下のプログラミング機能をサポートします。
•次の .NET Framework バージョンを対象とするアプリケーション:
•4.5.x(.NET Framework 4.5 と、そのポイント リリース 4.5.1、および 4.5.2)
•4.6.x(.NET Framework 4.6 と、そのポイント リリース 4.6.1、および 4.6.2)
•Database First、Code First、および Model First のワークフロー
•すべてのワークフローでの列挙型のサポート
•Code First Migrations
•POCO("Plain-old" CLR object)エンティティ
•DbContext クラス
また、Zen ADO.NET Entity Framework データ プロバイダーは、Microsoft ADO.NET Entity Framework 6.1、6.1.1、および 6.1.2 に固有の次の機能もサポートします。
•複数の DBContext クラス
•挿入、更新、および削除ストアド プロシージャへの Code First のマッピング
•構成可能な移行履歴
•接続の復元性
•Code First Migrations のインデックス属性
•関数インポートのトランザクションを無効にする
•Enum.HasFlag のサポート
•Migrations コマンドで、プロジェクトではなく参照からコンテキストを使用できるようにする
•web/app.config および DatabaseLogger のインターセプター
•'_' で始まる識別子のサポート
•文字列と数値が連結されたプロパティの選択
ADO.NET Entity Framework データ プロバイダーは、ADO.NET データ プロバイダーを使用して ADO.NET データベース サーバーと通信します。つまり、ADO.NET データ プロバイダーによって定義された機能は、ここで特に断りがない限り、ADO.NET Entity Framework データ プロバイダーに適用されるということです。同様に、ADO.NET データ プロバイダーに合わせて作られたすべてのパフォーマンス構成が、ADO.NET Entity Framework データ プロバイダーで実現されます。
Zen ADO.NET Entity Framework のアプリケーションを開発する場合は、Visual Studio 2012 以降が必要です。Visual Studio 2012 を使用するように Microsoft ADO.NET Entity Framework 6.1(EF 6.1)を構成している場合は、Visual Studio 2012 用の Entity Framework Tools 6.1.3 をインストールする必要があります。ただし、これをインストールすると、以前に Microsoft ADO.NET Entity Framework 5.0(EF5)を使用していたすべての Visual Studio 2012 アプリケーションは、EF 6.1 へのアップグレードが必要になります。アップグレード後、EF5 に戻すことはできません。
ADO.NET Entity Framework データ プロバイダーについて
ADO.NET Entity Framework データ プロバイダーは 100% マネージ コードで構築されています。つまり、完全に共通言語ランタイム(CLR)の内部で、実行およびデータベースへの接続が行えます。
クライアント ライブラリや COM コンポーネントなどネイティブ オペレーティング システムで実行するコードはアンマネージ コードと言います。マネージ コードとアンマネージ コードは 1 つのアプリケーション内に混在させることができます。ただし、アンマネージ コードは共通言語ランタイムの外部にまで影響が及ぶため、現実的には複雑になり、パフォーマンスも低下します。また、セキュリティの危険にさらすことにもなりかねません。
名前空間
ADO.NET Entity Framework データ プロバイダーの名前空間は、Pervasive.Data.SqlClient.Entity です。
メモ:Pervasive.Data.SqlClient.Entity 名前空間は、Microsoft ADO.NET Entity Framework バージョン 5.0(EF 5)と 6.1(EF 6.1)に共通です。
アセンブリ名
Zen ADO.NET Entity Framework データ プロバイダーは、3 つの異なるアセンブリ バージョンを使用します。
•EF5 を参照する Pervasive.Data.SqlClient.Entity.dll v4.3.0.0
•EF6 を参照する Pervasive.Data.SqlClient.Entity.dll v4.3.0.6
•EF6 を参照する Pervasive.Data.SqlClient.Entity.dll v4.4.0.6
ここで示すように、3 つのケースすべてにおいて、アセンブリ名 Pervasive.Data.SqlClient.Entity.dll は同じです。
インストール時、アセンブリは 3 つの別々のサブフォルダー、v4.3.0.0、v4.3.0.6、および v4.4.0.6 のグローバル アセンブリ キャッシュ(GAC)に配置されます。
EF 5 を参照する場合は、次を選択します。
%windir%\Microsoft.NET\assembly\GAC_MSIL\Pervasive.Data.SqlClient.Entity\v4.0_4.3.0.0__c84cd5c63851e072
EF 6.1 を参照する場合は、次を選択します。
%windir%\Microsoft.NET\assembly\GAC_MSIL\Pervasive.Data.SqlClient.Entity\v4.0_4.3.0.6__c84cd5c63851e072
または
%windir%\Microsoft.NET\assembly\GAC_MSIL\Pervasive.Data.SqlClient.Entity\v4.0_4.4.0.6__c84cd5c63851e072
Entity Framework 6.1 の構成
Zen ADO.NET Entity Framework データ プロバイダーは、Microsoft ADO.NET Entity Framework バージョン 5.0(EF5)および 6.1(EF 6.1)をサポートします。
EF 6.1 を使用するには、まず、次のいずれかの方法を使用して登録する必要があります。
メモ:EF 6.1 を登録する場合、アプリケーションをローカルでテストする限りは、開発時にコード ベース登録を実行できます。しかし、プロジェクトを配置する場合は、構成ファイル登録の実行が必要になります。
構成ファイル登録
►構成ファイルを更新して EF 6.1 を構成するには
1 EntityFramework 6.1.2 NuGet パッケージをインストールします。
app.config ファイルが作成されます。
2 app.config ファイルから defaultConnectionFactory 登録セクションを削除して、次のコードに置き換えます。
<providers>
<provider invariantName="Pervasive.Data.SqlClient"
type="Pervasive.Data.SqlClient.Entity.PsqlProviderServices, Pervasive.Data.SqlClient.Entity, Version=4.4.0.6, Culture=neutral, PublicKeyToken=c84cd5c63851e072" />
</providers>
EF 6.1 プロバイダー登録が、app.config ファイルの Entity Framework セクションに追加されます。
コード ベース登録
►コード ベース登録を使用して EF 6.1 を構成するには
1 次の新しい DbConfiguration クラスをテスト アプリケーションに追加します。
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
SetProviderServices("PsqlProviderServices.ProviderInvariantName, new PsqlProviderServices());
}
}
2 次のアノテーションを DBContext クラスの上に追加します。
[DbConfigurationType(typeof(MyConfiguration))]
同じデータベースでの複数 Entity Framework バージョンの使用
1 つのデータベースで複数のバージョンの Microsoft ADO.NET Entity Framework、5.0(EF5)および 6.1(EF 6.1)を使用することができます。ただし、同じデータベースに対して EF5 アプリケーションと EF6 アプリケーションを切り替えた場合、データベースに保存するときにエラーを受け取ります。
エラーが発生するのは、EF5 と EF6 で使用される "__MigrationHistory" テーブルの構造に違いがあるためです。
エラーを発生せずに、同じデータベースに対して EF5 と EF 6.1 のアプリケーションを使用するには、データベースで次のコマンドを実行します。
drop table "__MigrationHistory"
Zen ADO.NET Entity Framework データ プロバイダーでの接続文字列の使用
Zen ADO.NET Entity Framework は接続文字列に含まれている情報を使用して、基となる Entity Framework をサポートする ADO.NET データ プロバイダーに接続します。接続文字列には、必要なモデルおよびマッピング ファイルに関する情報も含まれています。
データ プロバイダーは、モデルにアクセスしたり、メタデータをマップしたり、データ ソースに接続したりする場合に接続文字列を使用します。
Entity Framework ウィザードで既存の接続を指定するか、または新しい接続を定義することができます。接続文字列オプションは、接続文字列で直接定義できますが、Visual Studio の[詳細プロパティ]ダイアログ ボックスでも設定できます(
サーバー エクスプローラーでの接続の追加を参照してください)。
サーバー エクスプローラーでの接続文字列の定義
Visual Studio を使って接続を追加、変更する方法については、
サーバー エクスプローラーでの接続の追加を参照してください。
サポートされる接続文字列オプションの説明については、表
28 を参照してください。
接続文字列オプションのデフォルト値の変更
ADO.NET Entity Framework データ プロバイダーで使用される接続文字列オプションのデフォルト値の多くは、Zen ADO.NET データ プロバイダーで使用されるデフォルト値と同じです(詳細については、表
28 を参照してください)。表
9 は、ADO.NET Entity Framework アプリケーションで接続文字列オプションを使用する場合には、違うデフォルト値になるオプションを示しています。
表 9 アプリケーションで使用される接続文字列オプションのデフォルト値
接続文字列オプション | ADO.NET Entity Framework アプリケーションでのデフォルト値 |
---|
Parameter Mode | サポートされません。 |
Statement Cache Mode | ExplicitOnly 値のみサポートされます。 |
Code First および Model First のサポート
Entity Framework 4.1 以降のプロバイダーは、Model First および Code First の機能をサポートしています。これらの機能のサポートを実装すると、たとえば、長い識別子名の処理方法など、データ プロバイダーへの変更が必要とされます。ただし、これらの変更はアプリケーションの変更を必要としません。
Code First および Model First の実装は、型マッピングの変更を必要とします。詳細については、
データ型および関数のマッピングを参照してください。
長い識別子名の処理
ほとんどの Zen 識別子の最大長は 20 バイトです。サーバー上で作成するオブジェクトの名前はクラス名とプロパティ名から取られるため、識別子名がこのサイズを超える場合があります。また、制約名は多くの場合、いくつかのオブジェクト名を連結して作成されます。このような場合には、識別子の最大長を超える可能性がさらに大きくなります。
データ プロバイダーは、識別子の末尾を整数のハッシュ コードに置き換えることにより、識別子をデータベースで許容される識別子の最大長に短縮します。たとえば、文字列 ColumnMoreThanTwentyCharacters は ColumnMor_2873286151 に短縮されます。DB ツールを使用して DB オブジェクトのアクセスや表示を行った場合、作成されたテーブルの名前が、POCO(Plain Old CLR Object)のクラス名とプロパティ名(Code First)、またはエンティティ名とエンティティのプロパティ名(Model First)に基づいて予想される名前とは異なる場合があります。
同じ先頭文字を持つ 2 つの識別子が短縮されると、識別子間の違いが目で見てわかりづらくなることに注意してください。たとえば、テーブルに 2 つのサポートするシーケンス、ColumnMoreThanTwentyCharacters と ColumnMoreThanTwenty1Characters があるとします。これらのシーケンスが短縮された場合、それぞれ ColumnMor_2873286151 と ColumnMor_672399971 に名前が変更されます。
ADO.NET Entity Framework での Code First Migrations の使用
Entity Framework 4.3 以降では Code First Migrations をサポートしています。これは、POCO クラスを削除して再作成しなくても、このクラスを反映するようにデータベース スキーマを更新することを可能にします。
移行は、モデルの変更に従って、データベース スキーマを増分で更新できるようにします。データベースに対する各変更セットは、移行として知られるコード ファイルで表されます。移行は、通常、タイムスタンプを使用して管理され、データベース内のテーブルは、どの移行がデータベースに適用されたかを追跡します。
Code First Migrations の実装は型マッピングの変更を必要とします。詳細については、
データ型および関数のマッピングを参照してください。
Progress DataDirect Connect for Zen ADO.NET データ プロバイダーを使用して Code First Migrations を実装するには、以下の追加設定を実行する必要があります。
1 プロジェクト内の Pervasive.Data.SQLClient.Entity アセンブリに参照を追加します。
2 Configuration Class の変更を継承し、Configuration Class のコンストラクターで SQL Generator を登録します。次のことを行います。
•PervasiveDbMigrationsConfiguration <TContext> から Configuration Class を継承します。たとえば、次のように指定します。
internal sealed class Configuration: PervasiveDbMigrationsConfiguration<%Context Name%>
•Class Generator を登録します。
パッケージ マネージャー コンソールを使用して移行を有効にした後、configuration.cs ファイルの追加設定に加えて、app.config または configuration.cs ファイルのいずれかで接続文字列を指定します。ただし、接続文字列を app.config ファイルに指定する場合は、接続文字列とコンテキストの名前が同じであるようにしてください。
接続文字列を app.config ファイルに指定する場合は、次の構文を使用して、app.config ファイルで SQL Generator を登録します。
<providers>
<provider invariantName="Pervasive.Data.SqlClient" type=
"Pervasive.Data.SqlClient.Entity.PsqlProviderServices,
Pervasive.Data.SqlClient.Entity, Version=4.4.0.6, Culture=neutral,
PublicKeyToken=c84cd5c63851e072" />
</providers>
configuration.cs で SQL Generator を登録するには、次の構文を使用します。
SetSqlGenerator(PervasiveConnectionInfo.InvariantName, new PervasiveEntityMigrationSqlGenerator());
ADO.NET Entity Framework での列挙型の使用
enum キーワードは、列挙型を宣言するために使用されます。列挙型は、列挙子リストと呼ばれる名前付き定数の集まりで構成される固有の型です。すべての列挙型には基になる型があります。デフォルトでは、列挙要素の基になるすべての型は int32 にマップされます。デフォルトでは、最初の列挙子の値は 0 で、後続の列挙子の値は 1 ずつ増加していきます。たとえば、曜日の列挙型は次のように指定します。
enum Days {MON, TUE, WED, THU, FRI, SAT, SUN};
この列挙型では、MON は 0、TUE は 1、WED は 2 などとなります。列挙子は、デフォルト値をオーバーライドする初期化子を持つことができます。たとえば、次のように指定します。
enum Days {MON=1, TUE, WED, THU, FRI, SAT, SUN};
この列挙型では、要素の並びは 0 ではなく 1 から開始します。列挙型のフィールドの名前は大文字です。これらは定数であるため、慣例により大文字にします。
Microsoft ADO.NET Entity Framework 5.0 以降は列挙型をサポートしています。列挙型の機能を使用するには、.NET Framework 4.5 以降を対象とする必要があります。Visual Studio 2012 の対象はデフォルトで .NET Framework 4.5 です。列挙型は 3 つのワークフロー、すなわち、Model First、Code First、および Database First でサポートされています。
Entity Framework では、列挙型の基になる型は次のとおりです。
•Byte
•Int16
•Int32
•Int64
•SByte
デフォルトでは、列挙型は Int32 型です。他の整数型はコロンを使用して指定します。
enum Days : byte{MON=1, TUE, WED, THU, FRI, SAT, SUN};
基になる型は、列挙子ごとに割り当てるストレージの大きさを指定します。ただし、enum 型を整数型に変更するには、明示的なキャストが必要です。enum の実装は型マッピングの変更もサポートしています。詳細については、
データ型および関数のマッピングを参照してください。
Entity Framework の一部として、Entity Developer が[モデル エクスプローラー]ウィンドウで新しい Enum ノードを提供することにより、enum 型を完全にサポートしています。Enum プロパティは、他のスカラー プロパティと同じように、LINQ クエリや更新などで使用できます。
データ型および関数のマッピング
ADO.NET Entity Framework を使用すると、開発者はリレーショナル ストレージ スキーマに対して直接プログラミングする代わりに、概念アプリケーション モデルに対してプログラミングすることで、データ アクセス アプリケーションを作成できます。
Database First の型マッピング
Database First モデルでは、データ プロバイダーはストア中心の型マッピング方式を使用します。このマッピングでは、Zen(ストア)型は、モデルの生成時に使用される EDM 型に影響を与えます。
Zen 型から EDM 型へのマッピングは、Zen 型から、Database First モデルで使用されるプリミティブ型へのマッピングを示しています。一部の Zen データ型はいくつかの異なる EDM 型にマップすることができます。デフォルト値は斜体で示されています。
列は次のように定義されています。
•[Zen 型]列は、ネイティブな型名を示しています。
•[ストア(SSDL)型]列は、ストア スキーマ定義言語(SSDL)ファイルで使用されるデータ型を示しています。ストレージ メタデータ スキーマは、EDM で構築されたアプリケーションのデータを保持する、データベースの形式的記述です。
•[PrimitiveTypeKind]列は、EDM アプリケーションを定義するのに使用されるエンティティのプロパティの、有効な内容を指定するために使用される共通のデータ プリミティブを示しています。
表 10 Zen 型から EDM 型へのマッピング
Zen 型 | ストア(SSDL)型 | PrimitiveTypeKind |
---|
AUTOTIMESTAMP | DateTime | DateTime |
BFLOAT4 | BFloat4 | Single |
BFLOAT8 | BFloat8 | Double |
BIGIDENTITY | Bigint | Int64 |
BIGINT | Bigint | Int64 |
BINARY | binary | Byte[] |
BIT | Bit | Boolean |
CHAR | Char | String |
CURRENCY | Currency | Decimal |
DATE | Date | DateTime |
DATETIME | DateTime | DateTime |
DECIMAL | Decimal | Decimal |
DOUBLE | Double | Double |
FLOAT | Float | Float |
IDENTITY | Identity | Int32 |
INTEGER | Integer | Int32 |
LONGVARBINARY | LongVarBinary | Byte[] |
LONGVARCHAR | LongVarChar | String |
MONEY | Money | Decimal |
NCHAR | NChar | String |
NLONGVARCHAR | NLongVarChar | String |
NUMERIC | Decimal | Decimal |
NUMERICSA | DecimalSA | Decimal |
NUMERICSTS | DecimalSTS | Decimal |
NVARCHAR | NVarChar | String |
REAL | Real | Single |
ROWID | Rowid | Binary |
SMALLIDENTITY | SmallIdentity | Int16 |
SMALLINT | Smallint | Int16 |
TIME | Time | Time |
TIMESTAMP、TIMESTAMP2 | DateTime | DateTime |
TINYINT | TinyInt | SByte |
UBIGINT | UBigInt | UInt64 |
UNIQUE_IDENTIFIER | Guid | Guid |
UINTEGER | UInteger | UInt32 |
USMALLINT | USmallInt | UInt16 |
UTINYINT | UTinyInt | Byte |
VARCHAR | Varchar | String |
Model First の型マッピング
EDM 型から Zen 型へのマッピングは、モデル中心の型マッピングを示しています。このマッピングでは、EDM 単純型は、データベースの作成に使用される Zen(ストア)型に影響を与えます。列は次のように定義されています。
•[PrimitiveTypeKind]列は、EDM アプリケーションを定義するのに使用されるエンティティのプロパティの、有効な内容を指定するために使用される共通のデータ プリミティブを示しています。
•[型マッピングに影響を与えるプロパティ値]列は、型マッピングに影響を及ぼす可能性のある、あらゆるプロパティ値を示しています。
•[ストア(SSDL)型]列は、ストア スキーマ定義言語(SSDL)ファイルで使用されるデータ型を示しています。ストレージ メタデータ スキーマは、EDM で構築されたアプリケーションのデータを保持する、データベースの形式的記述です。
•[Zen 型]列は、ネイティブな型名を示しています。
表 11 EDM 型から Zen 型へのマッピング
PrimitiveTypeKind | 型マッピングに影響を与えるプロパティ値 | ストア(SSDL)型 | Zen 型 |
---|
Binary | FixedLength:TRUE FixedLength:FALSE | Binary LongVarBinary | Binary(n) LongVarBinary |
Boolean | | Boolean | Bit |
Byte | | Tinylint_as_byte | TinyInt |
DateTime | | DateTime | DateTime |
Decimal | | Decimal | Decimal |
Double | | Double | Double |
Guid | | Guid | Guid |
Single | | Float | Float |
SByte | | Smallint_as_Sbyte | Smallint |
Int16 | | SmallInt | Smallint |
Int32 | | Integer | Integer |
Int64 | | Bigint | BigInt |
String | MaxLength= (1<=n<=8000) Fixed Length=True Unicode=False | Char | Char(n) |
MaxLength= (1<=n<=8000) Fixed Length=False Unicode=False | Varchar | Varchar(n) |
MaxLength= (>8000) Fixed Length=False Unicode=False | LongVarChar | LongVarchar |
MaxLength= (1<=n<=4000) Fixed Length=True Unicode=True | NChar | NChar(n) |
MaxLength= (1<=n<=4000) Fixed Length=False Unicode=True | NVarChar | NVarChar(n) |
MaxLength= (>4000) Fixed Length=False Unicode=True | NLongVarChar | NLongVarChar |
Time | | Time | Time |
DateTimeOffset | | DateTime | DateTime |
Code First の型マッピング
CLR 型から Code First モデルの Zen データ型へのマッピングは、モデル中心の型マッピングを示しています。このマッピングでは、CLR 型は、データベースの作成時に使用される Zen(ストア)型に影響を与えます。一部の CLR 型はいくつかの異なる Zen 型にマップすることができます。デフォルト値は斜体で示されています。
列は次のように定義されています。
•[CLR 型]列は、共通言語ランタイムの型名を示しています。
•[Zen 型]列は、ネイティブな型名を示しています。
表 12 CLR 型から Code First モデルの Zen データ型へのマッピング
CLR 型 | Zen データ型 |
---|
Byte | BINARY |
Boolean | BIT |
Byte | TINYINT |
DateTime | DATETIME |
Decimal | DECIMAL |
Double | DOUBLE |
Guid | UNIQUEIDENTIFIER BINARY |
Single | FLOAT |
Sbyte | SMALLINT |
Int16 | SMALLINT |
Int32 | INTEGER |
Int64 | BIGINT |
String1 | NCHAR NVARCHAR NLONGVARCHAR |
TimeSpan | TIME |
DateTimeOffset | DateTime |
1 Code First のワークフローでは、エンティティ内の文字列フィールドの長さが指定されていない場合、データ プロバイダーは unicode 型と非 unicode 型のデフォルトの長さをそれぞれ 2048 バイトと 4096 バイトに設定します。ただし、文字列フィールドの長さが最大許容限度に設定されている場合、つまり、unicode 型では 4000 バイト、非 unicode 型では 8000 バイトに設定されている場合、データ プロバイダーはそれぞれを 2048 バイトと 4096 バイトにリセットします。その他、文字列フィールドの長さが指定されているすべてのシナリオでは、データ プロバイダーは指定された長さを使用します。 |
EDM 正規関数から Zen 関数へのマッピング
ADO.NET Entity Framework は、エンティティ データ モデル(EDM)正規関数を Zen 用 ADO.NET Entity Framework データ プロバイダーの対応するデータ ソース機能に変換します。これによって、全データ ソースに共通する形式で表現される関数を呼び出すことができます。
これらの正規関数はデータ ソースから独立しているため、正規関数の引数の型と戻り値の型は、EDM の型の語句で定義されます。Entity SQL クエリで正規関数を使用すると、データ ソースで適切な関数が呼び出されます。
すべての正規関数には、ヌルが入力された場合の動作とエラー状況が明示的に指定されています。ただし、ADO.NET Entity Framework はこの動作を実行しません。詳細は、
http://msdn.microsoft.com/ja-jp/library/bb738626.aspx で入手できます。
集計正規関数
表
13 は、EDM 集計正規関数から Zen 関数へのマッピングを示します。
表 13 集計正規関数のマッピング
集計正規関数 | Zen 関数 |
---|
Avg(expression) | avg(expression) |
BigCount(expression) | count(expression) |
Count(expression) | count(expression) |
Max(expression) | max(expression) |
Min(expression) | min(expression) |
StDev(expression) | stdev(expression) |
StDevP(expression) | stdevp(expression) |
Sum(expression) | sum(expression) |
Var(expression) | var(expression) |
VarP(expression) | varp(expression) |
数学正規関数
表
14 は、EDM 数学正規関数から Zen 関数へのマッピングを示します。ただし、処理する列が decimal 値または integer 値のみを含んでいる場合に使用される関数を対象としています。
表 14 数学正規関数のマッピング
数学正規関数 | Zen 関数 |
---|
Abs(value) | abs(value) |
Ceiling(value) | ceiling(value) |
Floor(value) | floor(value) |
Power(value, exponent) | power(value, exponent) |
Round(value) | round(numeric_expression1, integer_expression2) |
Round(value, digits) | round(value, digits) |
Truncate(value, digits) | truncate(value, digits) |
日付と時刻の正規関数
表
15 は、EDM の日付と時刻の正規関数から Zen 関数へのマッピングを示します。これらの関数は、DATE や TIME などのデータ型から成るデータの生成、処理、および操作を行います。
表 15 日付と時刻の正規関数のマッピング
日付と時刻の正規関数 | Zen 関数 |
---|
AddNanoseconds(expression, number) | dateadd(millisecond, number/1000000) |
AddMicroseconds(expression, number) | dateadd(millisecond, number/1000) |
AddMilliseconds(expression, number) | dateadd(millisecond, number) |
AddSeconds(expression, number) | dateadd(second, number) |
AddMinutes(expression, number) | dateadd(minute, number) |
AddHours(expression, number) | dateadd(hour, number) |
AddDays(expression, number) | dateadd(day, number) |
AddMonths(expression, number) | dateadd(month, number) |
AddYears(expression, number) | dateadd(year, number) |
CreateDateTime(year, month, day, hour, minute, second) | datetimefromparts(year, month, day, hour, minute, second,0) |
CreateDateTimeOffset(year, month, day, hour, minute, second, tzoffset)1 | datetimeoffsetfromparts(year, month, day, hour, minute, second, tzoffset) |
CreateTime(hour, minute, second)1 | timefromparts(hour, minute, second, 0, 0) |
CurrentDateTime() | now() |
CurrentDateTimeOffset() | sysdatetimeoffset() |
CurrentUtcDateTime() | current_timestamp() |
Day(expression) | datepart(day, expression) |
DayOfYear(startexpression, endexpression) | dayofyear(expression) |
DiffNanoSeconds(startexpression, endexpression) | datediff(millisecond, startexpression, endexpression)*1000000 |
DiffMilliSeconds(startexpression, endexpression) | datediff(millisecond, startexpression, endexpression) |
DiffMicroSeconds(startexpression, endexpression) | datediff(millisecond, startexpression, endexpression)*1000 |
DiffSeconds(startexpression, endexpression) | datediff(second, startexpression, endexpression) |
DiffMinutes(startexpression, endexpression) | datediff(minute, startexpression, endexpression) |
DiffHours(startexpression, endexpression) | datediff(hour, startexpression, endexpression) |
DiffDays(startexpression, endexpression) | datediff(day, startexpression, endexpression) |
DiffMonths(startexpression, endexpression) | datediff(month, startexpression, endexpression) |
DiffYears(startexpression, endexpression) | datediff(year, startexpression, endexpression) |
GetTotalOffsetMinutes(DateTime Offset) | datepart(tzoffset, expression) |
Year(expression) | datepart(year, expression) |
Month(expression) | datepart(month, expression) |
Day(expression) | datepart(day, expression) |
Hour(expression) | datepart(hour, expression) |
Minute(expression) | datepart(minute, expression) |
Second(expression) | datepart(second, expression) |
Millisecond(expression) | datepart(millisecond, expression) |
TruncateTime(expression) | convert(expression, SQL_DATE) |
1 Zen v11.30 Update 4(May 2013)が必要です。 |
ビット単位の正規関数
表
16 は、EDM ビット単位の正規関数から Zen 関数へのマッピングを示します。
表 16 ビット単位の正規関数のマッピング
ビット単位の正規関数 | Zen 関数 |
---|
BitWiseAnd(value1, value2) | bit_and(value1, value2) |
BitWiseNot(value) | bit_compliment |
BitWiseOr(value1, value2) | bit_or |
BitWiseXor(value1, value2) | bit_xor |
文字列正規関数
表
17 は、EDM 文字列正規関数から Zen 関数へのマッピングを示します。
表 17 文字列正規関数のマッピング
文字列正規関数 | Zen 関数 |
---|
Concat(string1, string2) | concat(string1, string2) |
Contains(string, target) | contains(string, target) |
EndsWith(string, target) | endswith(string, target) |
IndexOf(target, string2) | instr(target, string2) |
Left(string1, length) | left(string1, length) |
Length(string) | length(string) |
LTrim(string) | ltrim(string) |
Trim(string) | trim(BOTH FROM string) |
Replace(string1, string2, string3) | replace(string1, string2, string3) |
Reverse(string) | reverse(string) |
RTrim(string) | rtrim(string) |
StartsWith(string, target) | startswith(string, target) |
Substring(string, start, length) | INCOMPLETE regexpr_substr(...) |
ToLower(string) | lower(string) |
ToUpper(string) | upper(string) |
その他の正規関数
表
18 は、その他の正規関数から Zen 関数へのマッピングを示します。
表 18 その他の正規関数のマッピング
その他の正規関数 | Zen 関数 |
---|
NewGuid() | newid() |
Entity Framework 機能の拡張
ADO.NET Entity Framework は、多くの ADO.NET 機能をマスクし、アプリケーション開発を簡略化することによって、強力な生産性の向上を提供します。ADO.NET データ プロバイダーには、パフォーマンスを最適化するように設計された機能が備わっています。
Microsoft Enterprise Library 6.0 の標準の Logging Application Block(LAB)および関連する設計パターンを使用するアプリケーションは、ADO.NET Entity Framework データ プロバイダーの一部として生成された SQL をすばやく表示することができます。
Entity Framework のパフォーマンスの向上
Entity Framework は強力な生産性の向上を提供しますが、一部の開発者は、アプリケーションでのパフォーマンスの最適化を必要とする機能について、Entity Framework が制御をしすぎると考えています。
XML スキーマ ファイルのサイズの制限
エンティティ データ モデル(EDM)を使って大きなモデルを構築すると、非常に効率が悪くなる可能性があります。最適な結果を得るために、モデルのエンティティが 50 から 100 に達している場合は、モデルを分割することを考慮してください。
XML スキーマ ファイルのサイズは、モデルを生成する基となったデータベースのテーブル、ビュー、またはストアド プロシージャの数にある程度比例します。スキーマ ファイルのサイズが大きくなるにつれ、メタデータの In-Memory モデルの作成や解析にかかる時間が増えます。これは、ObjectContext インスタンスごとに負担する、1 回限りのパフォーマンス コストです。
このメタデータは EntityConnection 文字列に基づいて、アプリケーション ドメインごとにキャッシュされます。つまり、1 つのアプリケーション ドメインの複数の ObjectContext インスタンスで同じ EntityConnection 文字列を使用している場合、アプリケーションがメタデータの読み込みに関してコストを負担するのは 1 回だけということです。しかし、モデルのサイズが大きくなる場合や、アプリケーションが長期にわたるものでない場合には、パフォーマンス コストが重要になる可能性があります。
ADO.NET Entity Framework でのストアド プロシージャの使用
ADO.NET Entity Framework でストアド プロシージャを使用するには、関数のマッピングが必要です。このようなストアド プロシージャの呼び出しは複雑で、いくらかのコーディングを必要とします。
機能の提供
Connection オブジェクトには、拡張された統計情報機能を提供するためのプロパティおよびメソッドが含まれています。これらは、ADO.NET データ プロバイダーでは標準ですが、ADO.NET Entity Framework レイヤーでは利用できません。代わりに、「擬似」ストアド プロシージャを介して同様の機能を公開します。
この方法では、エンティティ データ モデル(EDM)を使用して、ADO.NET の結果に対応する結果を得ます。これは実質的に、擬似ストアド プロシージャから戻されるエンティティおよび関数を提供します。
表
19 は、データ プロバイダーの Connection プロパティから対応する擬似ストアド プロシージャへのマッピングを示します。
表 19 擬似ストアド プロシージャへのマッピング
Connection プロパティ | 擬似ストアド プロシージャ |
---|
StatisticsEnabled | Psql_Connection_EnableStatistics Psql_Connection_DisableStatistics |
Connection メソッド | 擬似ストアド プロシージャ |
ResetStatistics | Psql_Connection_ResetStatistics |
RetrieveStatistics | Psql_Connection_RetrieveStatistics |
次の C# コードで示されているように、アプリケーションは ObjectContext を使用してストアド プロシージャ コマンドを作成する必要があります。
using (MyContext context = new MyContext())
{
EntityConnection entityConnection = (EntityConnection)context.Connection;
// EntityConnection は基となるストア接続を公開します
DbConnection storeConnection = entityConnection.StoreConnection;
DbCommand command = storeConnection.CreateCommand();
command.CommandText = "Psql_Connection_EnableStatistics";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new PsqlParameter("cid", 1));
}
//
bool openingConnection = command.Connection.State == ConnectionState.Closed;
if (openingConnection) { command.Connection.Open(); }
int result;
try
{
result = command.ExecuteNonQuery();
}
finally
{
if (openingConnection && command.Connection.State == ConnectionState.Open) { command.Connection.Close(); }
}
オーバーロードされたストアド プロシージャの使用
オーバーロードされたストアド プロシージャが複数ある場合、Zen Entity Framework データ プロバイダーは各ストアド プロシージャに識別子を追加して、SSDL でそれらを識別できるようにします。データ プロバイダーは、アプリケーションでストアド プロシージャを呼び出す前に、追加した識別子を削除します。
.NET オブジェクトの使用
ADO.NET Entity Framework データ プロバイダーは .NET パブリック オブジェクトをサポートし、それらをシールド オブジェクト(封印されたオブジェクト)として公開します。
ADO.NET Entity Framework のプログラミング コンテキストでは、本質的に一部の ADO.NET メソッドおよびプロパティを使用する必要がなくなります。しかし、これらのプロパティおよびメソッドは、標準の ADO.NET アプリケーションでは有用なままです。Visual Studio に組み込まれているオンライン ヘルプで、各クラスのパブリック メソッドおよびパブリック プロパティについて説明されています。
表
20 は、ADO.NET Entity Framework アプリケーションでデータ プロバイダーを使用する場合には不要となる、あるいは実装が異なるプロパティおよびメソッドを示しています。
表 20 ADO.NET Entity データ プロバイダーとの、プロパティおよびメソッドの相違点
プロパティまたはメソッド | 動作 |
---|
PsqlCommand |
AddRowID | サポートされません。ADO.NET Entity Framework は、返される追加データを処理しません。 |
ArrayBindCount | サポートされません。アプリケーションは、ADO.NET Entity Framework 上でこのバインド数に影響を与えることができません。 |
ArrayBindStatus | サポートされません。アプリケーションは、ADO.NET Entity Framework 上でこのバインド数に影響を与えることができません。 |
BindByName | サポートされません。代わりに、データ プロバイダーは ADO.NET Entity Framework プログラミング コンテキストを使用します。 |
CommandTImeout | サポートされません。代わりに、データ プロバイダーは ADO.NET Entity Framework プログラミング コンテキストを使用します。 |
UpdatedRowSource | サポートされません。代わりに、データ プロバイダーは ADO.NET Entity Framework プログラミング コンテキストを使用します。 |
PsqlCommandBuilder |
DeriveParameters | サポートされません。代わりに、データ プロバイダーは ADO.NET Entity Framework プログラミング コンテキストを使用します。 |
PsqlConnection |
ConnectionTimeout | 接続文字列でのみサポートされます。 |
StatisticsEnabled | StatisticsEnabled または StatisticsDisabled ストアド プロシージャを使用します。ADO.NET Entity Framework アプリケーションでこの関数を使用する方法については、 ADO.NET Entity Framework でのストアド プロシージャの使用を参照してください。 |
DataAdapter |
UpdateBatchSize | サポートされません。代わりに、データ プロバイダーは ADO.NET Entity Framework プログラミング コンテキストを使用します。 |
Error |
ErrorPosition | サポートされません。代わりに、データ プロバイダーは ADO.NET Entity Framework プログラミング コンテキストを使用します。 |
SQLState | サポートされません。代わりに、データ プロバイダーは ADO.NET Entity Framework プログラミング コンテキストを使用します。 |
モデルの作成
Entity Framework は、Visual Studio でデータのモデルを作成します。
メモ:Microsoft ADO.NET Entity Framework データ プロバイダーを使って開発するには、バージョン 4.3 の Zen ADO.NET Entity Framework データ プロバイダーの場合は、Microsoft .NET Framework バージョン 4.5.x または 4.6.x と Visual Studio 2012 以降を使用し、バージョン 4.4 の場合は VS 2017 以降を使用する必要があります。
Visual Studio で Entity Framework を使用してデータのモデルを作成するには、まず、データベース スキーマが利用可能になっていることを確認してください。
►Visual Studio で Entity Framework を使用してデータのモデルを作成するには
1 Visual Studio で、Windows コンソール、Windows フォームなどの新しい .NETアプリケーションを作成します。
2 ソリューション エクスプローラーでプロジェクトを右クリックし、[追加]>[新しい項目]をクリックします。
3 [
ADO.NET Entity Data Model]を選択したら、[
追加]をクリックします。
4 Entity Data Model ウィザードが表示されます。Microsoft ADO.NET Entity Framework 6.1(EF 6.1)を構成しているかどうかに基づいて、次のいずれかの操作を行います。
•EF 6.1 を構成して
いない場合は、[
データベースから生成]を選択して[
次へ]をクリックします。
•EF 6.1 を構成して
いる場合は、[
データベースから EF Designer]を選択して[
次へ]をクリックします。
5 [データ接続の選択]ページで[
新しい接続]をクリックして、新しい接続を作成します。既存の接続がある場合は、ドロップダウン リストからその接続を選択することができます。
6 [接続のプロパティ]ウィンドウが表示されます。必要な接続情報を指定して、[
OK]をクリックします。
7 ウィザードが Entity 接続文字列を作成します。
a. ラジオ ボタンが選択可能であれば、[はい、重要情報を接続文字列に含めます]を選択して、接続文字列に重要情報を含めるようにします。
b. [エンティティ接続設定に名前を付けて...に保存]フィールドで、メインのデータ アクセス クラスの名前を入力するか、またはデフォルトの名前を受け入れます。
c. [次へ]をクリックします。
8 構成されている Entity Framework のバージョンに基づいて、次のいずれかの操作を行います。
•現在のプロジェクト用に EF5 を構成している場合は、[バージョンの選択]ページで[
次へ]をクリックし、デフォルトの[
Entity Framework 5.0]で次へ進めます。
メモ:現在のプロジェクトで EF 6.1 を使用するには、ウィザードを終了し、EF 6.1 を構成した後、プロジェクトをリビルドします。EF 6.1 の構成後にプロジェクトをリビルドすると、ウィザードでは[バージョンの選択]ページが表示されず、次の手順へ直接進めるようになります。
•現在のプロジェクト用に EF 6.1 を構成している場合は、次の手順に進みます。
9 モデルで使用するデータベース オブジェクトを選択します。
10 [
完了]をクリックします。モデルが生成され、モデル ブラウザーで開かれます。
詳細情報
ADO.NET および Entity Framework の追加情報については、以下を参照してください。
•Programming Entity Framework by Julie Lerman は、ADO.NET Entity Framework の使い方の網羅的な議論を提供しています。
•接続文字列(Entity Framework)では、Entity Framework による接続文字列の使い方について説明します。接続文字列には、基となる ADO.NET データ プロバイダーへの接続に使用する情報が含まれているほか、必要なエンティティ データ モデルのマッピングおよびメタデータに関する情報も含まれています。
•Entity Data Model ツールでは、EDM を使用してアプリケーションを視覚的に構築するためのツールについて説明します。個別のツールとして、Entity Data Model ウィザード、ADO.NET Entity Data Model デザイナー(エンティティ デザイナー)、およびモデルの更新ウィザードがあります。これらのツールは共同して、エンティティ データ モデルを生成、編集、および更新することができます。
•LINQ to Entities を使用すると、開発者はビジネス ロジックの構築に使用された言語と同じ言語のデータベースに対するクエリを作成できるようになります。