ADO.NET Entity Framework データ プロバイダー
ADO.NET Entity Framework は、.NET Framework 用のオブジェクト リレーショナル マッピング(ORM)フレームワークです。このフレームワークを使用すると、開発者はリレーショナル ストレージ スキーマに対して直接プログラミングする代わりに、概念アプリケーション モデルに対してプログラミングすることで、データ アクセス アプリケーションを作成できます。このモデルによって、データ指向アプリケーションに必要なコードの量と保守作業の量を減らすことができます。
PSQL ADO.NET Entity Framework データ プロバイダーは、ADO.NET Entity Framework を使用するアプリケーションで使用できます。
表
10 は、Entity Framework データ プロバイダー機能のサポートの詳細を示しています。
表 10 サポートされる Entity Framework データ プロバイダー機能
ADO.NET Entity Framework データ プロバイダー | サポートされる機能 |
4.2 | •Microsoft ADO .NET Entity Framework 5.0.0 •Microsoft .NET Framework 4.5、4.5.1、および 4.5.2 •Database First •Code First •Model First •すべてのワークフローでの列挙型のサポート •Code First Migrations •POCO("Plain-old" CLR object)エンティティ •DbContext |
4.0 | •Microsoft .NET Framework 3.5 SP1 •Microsoft .NET Framework 4.0、Entity Framework 1.0 機能 •Database First •POCO("Plain-old" CLR object)エンティティ •DbContext |
ADO.NET Entity Framework データ プロバイダーは、ADO.NET データ プロバイダーを使用して ADO.NET データベース サーバーと通信します。つまり、ADO.NET データ プロバイダーによって定義された機能は、ここで特に断りがない限り、ADO.NET Entity Framework データ プロバイダーに適用されるということです。同様に、ADO.NET データ プロバイダーに合わせて作られたすべてのパフォーマンス構成が、ADO.NET Entity Framework データ プロバイダーで実現されます。
ADO.NET Entity Framework のアプリケーションを開発する場合は、Visual Studio 2012 以上が必要です。
Entity Framework データ プロバイダーのファイル名は、製品に付属する readme テキスト ファイルを参照してください。
ADO.NET Entity Framework データ プロバイダーについて
ADO.NET Entity Framework データ プロバイダーは 100% マネージ コードで構築されています。つまり、完全に共通言語ランタイム(CLR)の内部で、実行およびデータベースへの接続が行えます。
クライアント ライブラリや COM コンポーネントなどネイティブ オペレーティング システムで実行するコードはアンマネージ コードと言います。マネージ コードとアンマネージ コードは 1 つのアプリケーション内に混在させることができます。ただし、アンマネージ コードは共通言語ランタイムの外部にまで影響が及ぶため、現実的には複雑になり、パフォーマンスも低下します。また、セキュリティの危険にさらすことにもなりかねません。
名前空間
ADO.NET Entity Framework データ プロバイダーの名前空間は、Pervasive.Data.SqlClient.Entity です。
アセンブリ名
ADO.NET Entity Framework データ プロバイダーのアセンブリ名は、Pervasive.Data.SqlClient.Entity.dll です。基となる ADO.NET データ プロバイダーのアセンブリ名は、Pervasive.Data.SqlClient.dll です。厳密な名前のアセンブリは、インストール時にグローバル アセンブリ キャッシュ(GAC)に配置されます。
Pervasive.Data.Common アセンブリには、バルク ロードのサポートなどの機能が含まれます。
Entity Framework データ プロバイダーでの接続文字列の使用
ADO.NET Entity Framework は接続文字列に含まれている情報を使用して、基となる Entity Framework をサポートする ADO.NET データ プロバイダーに接続します。接続文字列には、必要なモデルおよびマッピング ファイルに関する情報も含まれています。
データ プロバイダーは、モデルにアクセスしたり、メタデータをマップしたり、データ ソースに接続したりする場合に接続文字列を使用します。
Entity Framework ウィザードで既存の接続を指定するか、または新しい接続を定義することができます。接続文字列オプションは、接続文字列で直接定義できますが、Visual Studio の[詳細プロパティ]ダイアログ ボックスでも設定できます(
サーバー エクスプローラーでの接続の追加を参照してください)。
サーバー エクスプローラーでの接続文字列の定義
Visual Studio を使って接続を追加、変更する方法については、
サーバー エクスプローラーでの接続の追加を参照してください。
サポートされる接続文字列オプションの説明については、表
29 を参照してください。
接続文字列オプションのデフォルト値の変更
ADO.NET Entity Framework データ プロバイダーで使用される接続文字列オプションのデフォルト値の多くは、PSQL ADO.NET データ プロバイダーで使用されるデフォルト値と同じです(詳細については、表
29 を参照してください)。表
11 は、接続文字列オプションを ADO.NET Entity Framework アプリケーションで使用する場合には、違うデフォルト値になるオプションを示しています。
表 11 アプリケーションで使用される接続文字列オプションのデフォルト値
接続文字列オプション | 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 の実装は、型マッピングの変更を必要とします。詳細については、
データ型および関数のマッピングを参照してください。
長い識別子名の処理
ほとんどの PSQL 識別子の最大長は 20 バイトです。サーバー上で作成するオブジェクトの名前はクラス名とプロパティ名から取られるため、識別子名がこのサイズを超える場合があります。また、制約名は多くの場合、いくつかのオブジェクト名を連結して作成されます。このような場合には、識別子の最大長を超える可能性がさらに大きくなります。
データ プロバイダーは、識別子の末尾を整数のハッシュ コードに置き換えることにより、識別子を 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 ADO.NET Pervasive データ プロバイダーを使用して Code First Migrations を実装するには、以下の追加設定を実行する必要があります。
1 プロジェクト内の DDTek.Pervasive.Entity アセンブリに参照を追加します。
2 Configuration Class の変更を継承し、Configuration Class のコンストラクターで SQL Generator を登録します。次のことを行います。
a. PervasiveDbMigrationsConfiguration <TContext> から Configuration Class を継承します。たとえば、次のようにします。
internal sealed class Configuration: PervasiveDbMigrationsConfiguration<%Context Name%>
b. Class Generator を登録します。
パッケージ マネージャー コンソールを使用して移行を有効にした後、configuration.cs ファイルの追加設定に加えて、app.config または configuration.cs ファイルのいずれかで接続文字列を指定します。ただし、接続文字列を app.config ファイルに指定する場合は、接続文字列とコンテキストの名前が同じであるようにしてください。
接続文字列を app.config ファイルに指定する場合は、次の構文を使用して、app.config ファイルで SQL Generator を登録します。
SetSqlGenerator("DDTek.Pervasive", new DDTek.Pervasive.Entity.Migrations.PervasiveEntityMigrationSqlGenerator());
configuration.cs で SQL Generator を登録するには、次の構文を使用します。
SetSqlGenerator(connectionInfo.GetInvariantName(), 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 から開始します。列挙型のフィールドの名前は大文字です。これらは定数であるため、慣例により大文字にします。
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 モデルでは、データ プロバイダーはストア中心の型マッピング方式を使用します。このマッピングでは、PSQL(ストア)型は、モデルの生成時に使用される EDM 型に影響を与えます。
PSQL 型から EDM 型へのマッピングは、PSQL 型から、Database First モデルで使用されるプリミティブ型へのマッピングを示しています。一部の PSQL データ型はいくつかの異なる EDM 型にマップすることができます。デフォルト値は斜体で示されています。
列は次のように定義されています。
•[PSQL 型]列は、ネイティブな型名を示しています。
•[ストア(SSDL)型]列は、ストア スキーマ定義言語(SSDL)ファイルで使用されるデータ型を示しています。ストレージ メタデータ スキーマは、EDM で構築されたアプリケーションのデータを保持する、データベースの形式的記述です。
•[PrimitiveTypeKind]列は、EDM アプリケーションを定義するのに使用されるエンティティのプロパティの、有効な内容を指定するために使用される共通のデータ プリミティブを示しています。
表 12 PSQL 型から EDM 型へのマッピング
PSQL 型 | ストア(SSDL)型 | PrimitiveTypeKind |
BFLOAT4 | BFloat4 | Single |
BFLOAT8 | BFloat8 | Double |
BIGINT | Binint | Int64 |
BINARY | binary | Byte[] |
BIT | Bit | Boolean |
CHAR | Char | String |
CURRENCY | Currency | Decimal |
DATE | Date | 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 |
SMALLIDENTITY | SmallIdentity | Int16 |
ROWID | Rowid | Binary |
SMALLINT | Smallint | Int16 |
TIME | Time | Time |
DATETIME | 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 型から PSQL 型へのマッピングは、モデル中心の型マッピングを示しています。このマッピングでは、EDM 単純型は、データベースの作成時に使用される PSQL(ストア)型に影響を与えます。列は次のように定義されています。
•[PrimitiveTypeKind]列は、EDM アプリケーションを定義するのに使用されるエンティティのプロパティの、有効な内容を指定するために使用される共通のデータ プリミティブを示しています。
•[型マッピングに影響を与えるプロパティ値]列は、型マッピングに影響を及ぼす可能性のある、あらゆるプロパティ値を示しています。
•[ストア(SSDL)型]列は、ストア スキーマ定義言語(SSDL)ファイルで使用されるデータ型を示しています。ストレージ メタデータ スキーマは、EDM で構築されたアプリケーションのデータを保持する、データベースの形式的記述です。
•[PSQL 型]列は、ネイティブな型名を示しています。
表 13 EDM 型から PSQL 型へのマッピング
PrimitiveTypeKind | 型マッピングに影響を与えるプロパティ値 | ストア(SSDL)型 | PSQL 型 |
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 モデルの PSQL データ型へのマッピングは、モデル中心の型マッピングを示しています。このマッピングでは、CLR 型は、データベースの作成時に使用される PSQL(ストア)型に影響を与えます。一部の CLR 型はいくつかの異なる PSQL 型にマップすることができます。デフォルト値は斜体で示されています。
列は次のように定義されています。
•[CLR 型]列は、共通言語ランタイムの型名を示しています。
•[PSQL 型]列は、ネイティブな型名を示しています。
表 14 CLR 型から Code First モデルの PSQL データ型へのマッピング
CLR 型 | PSQL データ型 |
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 正規関数から PSQL 関数へのマッピング
ADO.NET Entity Framework は、エンティティ データ モデル(EDM)正規関数を PSQL 用 ADO.NET Entity Framework データ プロバイダーの対応するデータ ソース機能に変換します。これによって、全データ ソースに共通する形式で表現される関数を呼び出すことができます。
これらの正規関数はデータ ソースから独立しているため、正規関数の引数の型と戻り値の型は、EDM の型の語句で定義されます。Entity SQL クエリで正規関数を使用すると、データ ソースで適切な関数が呼び出されます。
すべての正規関数には、ヌルが入力された場合の動作とエラー状況が明示的に指定されています。ただし、ADO.NET Entity Framework はこの動作を実行しません。詳細は、
http://msdn.microsoft.com/ja-jp/library/bb738626.aspx で入手できます。
集計正規関数
表
15 は、EDM 集計正規関数から PSQL 関数へのマッピングを示します。
表 15 集計正規関数のマッピング
集計正規関数 | PSQL 関数 |
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) |
数学正規関数
表
16 は、EDM 数学正規関数から PSQL 関数へのマッピングを示します。ただし、処理する列が decimal 値または integer 値のみを含んでいる場合に使用される関数を対象としています。
表 16 数学正規関数のマッピング
数学正規関数 | PSQL 関数 |
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) |
日付と時刻の正規関数
表
17 は、EDM の日付と時刻の正規関数から PSQL 関数へのマッピングを示します。これらの関数は、DATE や TIME などのデータ型から成るデータの生成、処理、および操作を行います。
表 17 日付と時刻の正規関数のマッピング
日付と時刻の正規関数 | PSQL 関数 |
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 PSQL v11.30 Update 4(May 2013)が必要です。 |
ビット単位の正規関数
表
18 は、EDM ビット単位の正規関数から PSQL 関数へのマッピングを示します。
表 18 ビット単位の正規関数のマッピング
ビット単位の正規関数 | PSQL 関数 |
BitWiseAnd(value1, value2) | bit_and(value1, value2) |
BitWiseNot(value) | bit_compliment |
BitWiseOr(value1, value2) | bit_or |
BitWiseXor(value1, value2) | bit_xor |
文字列正規関数
表
19 は、EDM 文字列正規関数から PSQL 関数へのマッピングを示します。
表 19 文字列正規関数のマッピング
文字列正規関数 | PSQL 関数 |
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) |
その他の正規関数
表
20 は、その他の正規関数から PSQL 関数へのマッピングを示します。
表 20 その他の正規関数のマッピング
その他の正規関数 | PSQL 関数 |
NewGuid() | newid() |
Entity Framework 機能の拡張
ADO.NET Entity Framework は、多くの ADO.NET 機能をマスクし、アプリケーション開発を簡略化することによって、強力な生産性の向上を提供します。PSQL ADO.NET データ プロバイダーには、パフォーマンスを最適化するように設計された機能が備わっています。
Microsoft Enterprise Library 4.1 の標準の Logging Application Block(LAB)および関連する設計パターンを使用するアプリケーションは、ADO.NET Entity Framework データ プロバイダーの一部として生成された SQL をすばやく表示することができます。
Entity Framework のパフォーマンスの向上
Entity Framework は強力な生産性の向上を提供しますが、一部の開発者は、アプリケーションでのパフォーマンスの最適化を必要とする機能について、Entity Framework が制御をしすぎると考えています。
ADO.NET には、確立した比較的単純な一連のメソッドが備わっており、それらを使用して、接続統計情報や再認証などの機能の有効化および管理が行えます。ADO.NET Entity Framework データ プロバイダーにはさらに拡張機能が含まれており、それらを使用して、接続に関する統計カウンターの有効化、取得、およびリセットが行えます。開発者は、これらの拡張機能を使用すると、最終的にアプリケーションの実行時のパフォーマンスを向上させることができます。
Entity Framework にも類似した一連のメソッドが含まれていますが、これらは、LINQ、EntitySQL、および ObjectServices などの新しい Entity Framework コンシューマーで利用できるように適応させてあります。
この機能は、
.edmx ファイルの使用で示されている XML ファイルでモデル化されます。PsqlConnectionStatistics エンティティおよび PsqlStatus エンティティを公開することにより、標準ツールを使って、このコードをすばやくモデル化することができます。
接続統計情報の取得
まず、エンティティ コンテナーの PsqlConnectionContext を確立します。これには 2 つのエンティティ セット、PsqlConnectionStatistics および PsqlStatus が含まれています。各エンティティと対話するには、結果を取得するための関数を含めます。
次の C# コードでは、ObjectConnect を使用してこれらの統計情報へアクセスする方法を示しています。
DTekConnectionContext objCtx = new PsqlConnectionContext();
PsqlStatus status = objCtx.DisableStatistics().First();
MessageBox.Show("StatisticsEnabled = " + status.StatisticsEnabled);
status = objCtx.EnableStatistics().First();
MessageBox.Show("StatisticsEnabled = " + status.StatisticsEnabled);
PsqlConnectionStatistics statistics = objCtx.RetrieveStatistics().First();
MessageBox.Show("BytesReceived/Sent: " +
statistics.BytesReceived + "/" + statistics.BytesSent);
PsqlConnectionContext は app.config ファイルで宣言されています。
<add name="PsqlConnectionContext"
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Pervasive.Data.SqlClient;provider connection string="Host=nc-lnx02;Password=login4;Pooling=False;SID=CP31;User ID=login4;Reauthentication Enabled=true"" providerName="System.Data.EntityClient" />
接続統計情報に対するデータ プロバイダーのサポートについては、
接続統計情報の取得を参照してください。
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 の結果に対応する結果を得ます。これは実質的に、疑似ストアド プロシージャから戻されるエンティティおよび関数を提供します。
表
21 は、データ プロバイダーの Connection プロパティから対応する疑似ストアド プロシージャへのマッピングを示します。
表 21 疑似ストアド プロシージャへのマッピング
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(); }
}
オーバーロードされたストアド プロシージャの使用
オーバーロードされたストアド プロシージャが複数ある場合、PSQL Entity Framework データ プロバイダーは各ストアド プロシージャに識別子を追加して、SSDL でそれらを識別できるようにします。データ プロバイダーは、アプリケーションでストアド プロシージャを呼び出す前に、追加した識別子を削除します。
.NET オブジェクトの使用
ADO.NET Entity Framework データ プロバイダーは .NET パブリック オブジェクトをサポートし、それらをシールド オブジェクト(封印されたオブジェクト)として公開します。
ADO.NET Entity Framework のプログラミング コンテキストでは、本質的に一部の ADO.NET メソッドおよびプロパティを使用する必要がなくなります。しかし、これらのプロパティおよびメソッドは、標準の ADO.NET アプリケーションでは有用なままです。Visual Studio に組み込まれているオンライン ヘルプで、各クラスのパブリック メソッドおよびパブリック プロパティについて説明されています。
表
22 は、ADO.NET Entity Framework アプリケーションでデータ プロバイダーを使用する場合には不要となる、あるいは実装が異なるプロパティおよびメソッドを示しています。
表 22 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 でデータのモデルを作成します。
メモ: PSQL バージョン 4.2 ADO.NET Entity Framework データ プロバイダーを使って開発するには、Microsoft .NET Framework バージョン 4.5 以上と Visual Studio 2012 以上を使用する必要があります。
以下の手順は、既にデータベース スキーマが利用可能になっていることを前提とします。
1 Visual Studio で、Windows コンソール、Windows フォーム、または ASP.NET などの新しいアプリケーションを作成します。
2 ソリューション エクスプローラーでプロジェクトを右クリックし、[追加]>[新しい項目]をクリックします。
3 [ADO.NET Entity Data Model]を選択したら、[追加]をクリックします。
4 Entity Data Model ウィザードが表示されます。[データベースから生成]を選択し、[次へ]をクリックします。
5 [新しい接続]をクリックして、新しい接続を作成します。既存の接続がある場合は、この手順でその接続を選択することができます。
a. [データ ソースの選択]ウィンドウで、データ ソース リストから "その他" を選択し、次にデータ プロバイダーのドロップダウン リストから "ADO.NET PSQL Provider" を選択します。
b. [続行]をクリックします。
c. [接続のプロパティ]ウィンドウが表示されます。必要な接続情報を指定して、[OK]をクリックします。
6 ウィザードが Entity 接続文字列を作成します。
a. ラジオ ボタンが選択可能であれば、[はい、重要情報を接続文字列に含めます]を選択して、接続文字列に重要情報を含めるようにします。
b. [エンティティ接続設定に名前を付けて ... に保存]フィールドで、メインのデータ アクセス クラスの名前を入力するか、もしくはデフォルトの名前を受け入れます。
c. [次へ]をクリックします。
7 モデルで使用するデータベース オブジェクトを選択します。
8 [完了]をクリックします。モデルが生成され、モデル ブラウザーで開かれます。
詳細
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 を使用すると、開発者はビジネス ロジックの構築に使用された言語と同じ言語のデータベースに対するクエリを作成できるようになります。