Zen ADO.NET Entity Framework データ プロバイダー
Zen 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 のバージョン 6.1、6.1.1、および 6.1.2 と互換性があります。以下のプログラミング機能をサポートします。
•Database First、Code First、および Model First のワークフロー
•すべてのワークフローでの列挙型のサポート
•Code First Migrations
•POCO("Plain-old" CLR object)エンティティ
•DbContext クラス
•複数の DBContext クラス
•挿入、更新、および削除ストアド プロシージャへの Code First のマッピング
•構成可能な移行履歴
•接続の復元性
•Code First Migrations のインデックス属性
•関数インポートのトランザクションを無効にする
•Enum.HasFlag のサポート
•Migrations コマンドで、プロジェクトではなく参照からコンテキストを使用できるようにする
•web/app.config および DatabaseLogger のインターセプター
•'_' で始まる識別子のサポート
•文字列と数値が連結されたプロパティの選択
Zen ADO.NET Entity Framework データ プロバイダーは、ADO.NET データ プロバイダーを使用して ADO.NET データベース サーバーと通信します。つまり、Zen ADO.NET データ プロバイダーによって定義された機能は、ここで特に断りがない限り、Zen ADO.NET Entity Framework データ プロバイダーに適用されるということです。同様に、Zen ADO.NET データ プロバイダーに合わせて作られたすべてのパフォーマンス構成が、Zen ADO.NET Entity Framework データ プロバイダーで実現されます。
Zen ADO.NET Entity Framework のアプリケーションを開発する場合は、Visual Studio 2017 以降が必要です。Visual Studio 2017 を使用するように Microsoft ADO.NET Entity Framework 6.1(EF 6.1)を構成している場合は、Visual Studio 2017 用の Entity Framework Tools 6.1.3 をインストールする必要があります。ただし、これをインストールすると、以前に Microsoft ADO.NET Entity Framework 5.0(EF5)を使用していたすべての Visual Studio 2017 アプリケーションは、EF 6.1 へのアップグレードが必要になります。アップグレード後、EF5 に戻すことはできません。
Zen ADO.NET Entity Framework データ プロバイダーについて
Zen ADO.NET Entity Framework データ プロバイダーはマネージ コードのみで構築されています。つまり、完全に共通言語ランタイム(CLR)の内部で、実行およびデータベースへの接続が行えます。
クライアント ライブラリや COM コンポーネントなどネイティブ オペレーティング システムで実行するコードはアンマネージ コードと言います。マネージ コードとアンマネージ コードは 1 つのアプリケーション内に混在させることができます。ただし、アンマネージ コードは共通言語ランタイムの外部にまで影響が及ぶため、現実的には複雑になり、パフォーマンスも低下します。また、セキュリティの危険にさらすことにもなりかねません。
名前空間
Zen 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 データ プロバイダーは、Pervasive.Data.SqlClient.Entity.dll という名前のアセンブリを使用します。
4.4 バージョンのプロバイダーを使用する EF 6.1 を参照するには、次を選択します。
%windir%\Microsoft.NET\assembly\GAC_MSIL\Pervasive.Data.SqlClient.Entity\v4.0_4.4.0.6__c84cd5c63851e072
4.5 バージョンのプロバイダーを使用する EF 6.1 を参照するには、次を選択します。
%windir%\Microsoft.NET\assembly\GAC_MSIL\Pervasive.Data.SqlClient.Entity\v4.0_4.5.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 登録セクションを削除し、使用するプロバイダーのバージョンに応じて次のコードに置き換えます。
•4.4 バージョンの場合:
<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>
•4.5 バージョンの場合:
<providers>
<provider invariantName="Pervasive.Data.SqlClient"
type="Pervasive.Data.SqlClient.Entity.PsqlProviderServices, Pervasive.Data.SqlClient.Entity, Version=4.5.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 を使って接続を追加、変更する方法については、
サーバー エクスプローラーでの接続の追加を参照してください。
サポートされる接続文字列オプションの説明については、表
35 を参照してください。
接続文字列オプションのデフォルト値の変更
ADO.NET Entity Framework データ プロバイダーで使用される接続文字列オプションのデフォルト値の多くは、Zen ADO.NET データ プロバイダーで使用されるデフォルト値と同じです(詳細については、表
35 を参照してください)。表
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 を登録します。
•4.4 バージョンの場合:
<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>
•4.5 バージョンの場合:
<providers>
<provider invariantName="Pervasive.Data.SqlClient"
type="Pervasive.Data.SqlClient.Entity.PsqlProviderServices, Pervasive.Data.SqlClient.Entity, Version=4.5.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 以降を対象とする必要があります。列挙型は 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 でデータのモデルを作成します。
メモ:ADO.NET Entity Framework データ プロバイダーを使って開発するには、バージョン 4.4 または 4.5 の Actian Zen ADO.NET Entity Framework データ プロバイダーと一緒に、Microsoft .NET Framework バージョン 4.5.x、4.6.x、4.7.x、または 4.8 と、Visual Studio 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 [
完了]をクリックします。モデルが生成され、モデル ブラウザーで開かれます。
Entity Framework 5 アプリケーションから Entity Framework 6.1 へのアップグレード
Entity Framework Power Tools を使用して、EF 6.1 でマッピング ビューを再生成することができます。Entity Framework Power Tools を Zen ADO.NET Entity Framework プロバイダーと連動させるには、.NET Framework 4.0 の machine.config ファイルに Provider の登録エントリを追加する必要があります。
下記の手順では、Zen ADO.NET Entity Framework プロバイダーを使用して作成された EF 5 アプリケーションを EF 6.1 アプリケーションにアップグレードします。この手順は、EF 5 アプリケーションを EF 6.1 にアップグレードする場合にのみ必要となります。アップグレード後、machine.config ファイルの編集を元に戻すことにより、以前の内容に戻すことをお勧めします。
メモ:Entity Framework 5 Code First アプリケーションで作成されたオブジェクトがターゲット データベースに既に含まれている場合は、それらのオブジェクトを削除してから、移行された Entity Framework 6.1 アプリケーションを実行する必要があります。Entity Framework 5.0 は Entity Framework 6.1 とは異なる外部キー制約名を生成するため、それにより、アプリケーションは "テーブルまたはビューは既に存在します" というエラーで失敗します。
►machine.config ファイルを編集するには
1 以下の手順を続行する前に、すべての Visual Studio ウィンドウを閉じてください。
2 次の場所にある .Net Framework 4 用の machine.config ファイルを開きます。64 ビット システムを使用している場合は、2 番目の場所にあるファイルも開きます。
•%windir%\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
•%windir%\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
3 <configSections></configSections> ノード下に次のエントリを追加します。
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
4 <configuration> </configuration> ノード下の </configSections> 閉じるタグより後に、次のエントリを追加します。
<entityFramework>
<providers>
<provider invariantName="Pervasive.Data.SqlClient" type="Pervasive.Data.SqlClient.Entity.PsqlProviderServices, Pervasive.Data.SqlClient.Entity, Version=4.5.0.6, Culture=neutral, PublicKeyToken=c84cd5c63851e072" />
</providers>
</entityFramework>
メモ:このバージョン 4.5 の例では Version=4.5.0.6 を使用しています。バージョン 4.4 の場合は、Version=4.4.0.6 を使用します。
5 変更したファイルを保存して閉じます。
6 対応するプロジェクトに EF バージョン 6.1.2 をインストールする必要があります。これを行うには、プロジェクトを新しい EF 6.1.x ランタイムにアップグレードする必要があります。次の 2 つの方法のいずれかにより実行できます。
方法 1
a. プロジェクトを右クリックして、[NuGet パッケージの管理]をクリックします。
b. [オンライン]タブで、EntityFramework を選択して[インストール]をクリックします。
以前のバージョンの EntityFramework NuGet パッケージが EF 6.1.x にアップグレードされます。
方法 2
EF 6.1.2 をインストールする対応プロジェクトに対し、パッケージ マネージャー コンソールから次のコマンドを実行します。
Install-Package EntityFramework -Version 6.1.2
7 いずれかの方法を使用した後、System.Data.Entity.dll へのアセンブリ参照が削除されていることを確認します。
EF6 NuGet パッケージをインストールすると、System.Data.Entity へのすべての参照がプロジェクトから自動的に削除されます。
8 EF 6.x のコード生成を使用するように Enterprise Framework Designer(EDMX)モデルを変更します。EF Designer で作成されたモデルがある場合は、コード生成テンプレートを更新して、EF6 互換コードを生成する必要があります。
メモ:Visual Studio 2012 以降の場合は、EF 6.x DbContext Generator テンプレートのみ使用できます。
a. 既存のコード生成テンプレートを削除します。
これらのファイルには通常、<edmx ファイル名>.tt や <edmx ファイル名>.Context.tt という名前が付けられており、ソリューション エクスプローラーで .edmx ファイルの下に入れ子になっています。ソリューション エクスプローラーでテンプレートを選択し、Delete キーを使用してそれらを削除することができます。
メモ:Web サイト プロジェクトでは、ソリューション エクスプローラー内のテンプレートは .edmx ファイルの下に入れ子になっているのではなく、並んで存在しています。VB.NET プロジェクトでは、[すべてのファイルを表示]を有効にして、入れ子になったテンプレート ファイルを表示できるようにする必要があります。
b. 適切な EF 6.x コード生成テンプレートを追加します。
EF Designer でモデルを開き、デザイン画面を右クリックして[コード生成項目の追加]を選択します。
•DbContext API(推奨)を使用している場合は、[データ]タブで EF 6.x DbContext Generator を使用できます。
Visual Studio 2012 を使用している場合は、このテンプレートを使用するために EF 6 Tools をインストールする必要があることに注意してください。詳細については、Microsoft の「Entity Framework を取得する」(https://msdn.microsoft.com/ja-jp/library/ee712906(v=vs.113).aspx)を参照してください。
•ObjectContext API を使用している場合は、[オンライン]タブを選択し、EF 6.x EntityObject Generator を検索する必要があります。
c. コード生成テンプレートにカスタマイズを適用した場合は、更新されたテンプレートに再適用する必要があります。
9 使用しているすべてのコア EF 型の名前空間を更新します。
DbContext 型および Code First 型は変更されていません。これは、EF 4.1 以降を使用する多くのアプリケーションでは、何も変更する必要がないことを意味します。
以前は System.Data.Entity.dll にあった ObjectContext などの型は、新しい名前空間に移動されました。つまり、EF6 に対してビルドするには、using ディレクティブまたは import ディレクティブを更新する必要があります。
名前空間の変更に関する一般的な規則は、「System.Data.* 内のすべての型が System.Data.Entity.Core.*.に移動される」ということです。言い換えると、System.Data の後に Entity.Core を挿入するだけです。たとえば、次のようになります。
•System.Data.EntityException => System.Data.Entity.Core.EntityException
•System.Data.Objects.ObjectContext => System.Data.Entity.Core.Objects.ObjectContext
•System.Data.Objects.DataClasses.RelationshipManager => System.Data.Entity.Core.Objects.DataClasses.RelationshipManager
これらの型は、ほとんどの DbContext ベースのアプリケーションでは直接使用されないため、Core 名前空間にあります。System.Data.Entity.dll の一部であった一部の型は、DbContext ベースのアプリケーションでよく使用され、直接使用されるため、Core 名前空間に移動されていません。次のものが該当します。
•System.Data.EntityState => System.Data.Entity.EntityState
•System.Data.Objects.DataClasses.EdmFunctionAttribute => System.Data.Entity.DbFunctionAttribute
メモ:このクラスは名前が変更されました。古い名前のクラスは引き続き存在し、動作しますが、現在は不使用とマークされています。
•System.Data.Objects.EntityFunctions => System.Data.Entity.DbFunctions
メモ:このクラスは名前が変更されました。古い名前のクラスは引き続き存在し、動作しますが、現在は不使用とマークされています。
10 マッピング ビューを再生成します。
以前にマッピング ビューを生成した場合は、そのファイルを削除して、マッピング ビューを再生成します。マッピング ビューの詳細については、https://msdn.microsoft.com/en-us/data/dn469601 を参照してください。
これで、Zen ADO.NET データ プロバイダーを使用してビルドされた EF 5 アプリケーションが EF 6.1.2 にアップグレードされました。
メモ:すべての EF 5 アプリケーションが EF 6.1.2 にアップグレードされたら、machine.config ファイルに加えた変更を元に戻し、以前の machine.config ファイルを復元することをお勧めします。
Entity Framework Power Tools は、ビュー モデルを使用する EF 5.0 アプリケーションを EF 6.1 アプリケーションに移行するためのより簡単な方法を提供します。テスト中、Entity Framework Power Tools が Zen Entity Framework プロバイダーで正常に機能することがわかりました。
メモ:Entity Framework Power Tools は、Zen ADO.NET Entity Framework データ プロバイダーでは認定済みのサポートされているツールではありません。
詳細情報
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 を使用すると、開発者はビジネス ロジックの構築に使用された言語と同じ言語のデータベースに対するクエリを作成できるようになります。