Caché Entity Framework Provider の使用法
Entity Framework は、.NET 開発者がドメイン固有オブジェクトを使用してリレーショナル・データを処理できるようにするオブジェクト・リレーショナル・マッパです。これにより、開発者が通常記述する必要があるデータ・アクセス・コードの大半が必要なくなります。Caché には、Entity Framework 6 テクノロジを使用して Caché データベースにアクセスできるようにする Caché Entity Framework Provider が含まれています。 (Entity Framework 5 を使用している場合は、詳細についてインターシステムズの担当者にお問い合わせください。).NET Entity Framework の詳細は、http://www.asp.net/entity-frameworkOpens in a new tab を参照してください。
この章には、以下のセクションが含まれます。
-
Caché Entity Framework Provider の設定 — システム要件、インストール、および設定に関する情報が記載されています。
-
Entity Framework の開始 — EF の使用を開始するための方法を説明します。
-
Code First — データ・クラスの定義から開始し、クラス・プロパティからデータベースを生成します。
-
Database First Database First — 既存のデータベースから開始します。"サンプル・データベースの設定" セクションの手順に従うことにより、データベースを設定できます。続けて、Entity Framework を使用して、そのデータベースのフィールドに基づいて Web アプリケーションのコードを生成します。
-
Model First Model First — エンティティとリレーションシップを示すデータベース・モデルを作成することから開始します。その後、モデルからデータベースを生成します。
-
このセクションでは、Entity Framework を開始するための 3 つの方法を説明します。
Caché Entity Framework Provider の設定
Caché Entity Framework Provider のインストールおよび設定を行うには、このセクションの手順を実行します。
システム要件
Caché Entity Framework Provider を使用するには、以下のソフトウェアが必要になります。
-
Update 5 (またはそれ以降のアップデート) が適用された Visual Studio 2013 (Professional または Ultimate)。
-
installdir\dev\dotnet\bin\v4.0.30309 ディレクトリにある Caché Entity Framework Provider のディストリビューション。このディレクトリには、設定手順で使用する以下のファイルが含まれています。
-
CacheEF.zip — インストール・ファイル。
-
CacheEF.zip\setup.cmd — DLL の InterSystems.Data.CacheClient.dll および InterSystems.Data.CacheVSTools.dll をインストールします。
-
CacheEF.zip\Nuget\InterSystems.Data.Entity6.4.5.0.0.nupkg — Caché Entity Framework Provider をインストールします。
-
CacheEF.zip\CreateNorthwindEFDB.sql — サンプル・データベースの作成に使用されます。
-
設定の実行および変数の設定
以下の手順を実行します。
-
installdir\dev\dotnet\bin\v4.0.30309\CacheEF.zip のコンテンツを CacheEF と呼ばれるフォルダ (zip ファイルと同じディレクトリ内) に抽出します。\CacheEF\setup.cmd を実行します。
-
Windows で、[すべてのプログラム]→[Visual Studio 2013]→[Visual Studio のツール] の順に選択します。
-
表示された Windows エクスプローラのフォルダで、[Developer Command Prompt for VS2013] を右クリックし、[管理者として実行] を選択して、以下を入力します。
devenv /setup
このコマンドにより、HKEY_LOCAL_MACHINE から以下のキーが再生成されます。
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config //VS 2013
Visual Studio へのファイルのコピー
CacheEF ディレクトリから Visual Studio に 2つのファイルをコピーします。
-
SSDLToCacheSQL.tt
-
GenerateCacheSQL.Utility.ttinclude
コピー元: <cacheinstalldir>\dev\dotnet\bin\v4.0.30319\CacheEF\Templates。コピー先: C:\Program Files (x86)\Microsoft Visual Studio 1x.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen。
Caché サーバへの Visual Studio の接続
Caché インスタンスに Visual Studio を接続するには、以下の手順を実行します。
-
Visual Studio を開き、[表示]→[サーバー エクスプローラ] の順に選択します。
-
[データ接続] を右クリックして、[接続の追加] を選択します。[接続の追加] ダイアログで、以下の手順を実行します。
-
[データ ソース] で [Cache Data Source (.Net Framework Data Provider for Cache)] を選択します。
-
[サーバー] を選択します。
-
[ユーザー名] および [パスワード] を入力します。[接続] をクリックします。
-
リストからネームスペースを選択します。[OK] をクリックします。
-
Caché Nuget ローカル・リポジトリの構成
パッケージ・マネージャを構成し、ローカルの Nuget リポジトリを見つけ出すには、以下の手順を実行します。
-
ディレクトリを Nuget リポジトリとして作成します。これに Nuget Repository などの名前を指定します。これは好きな場所に置くことができます。お勧めの場所は <yourdoclibraryVS2013>\Projects です (既定で Visual Studio がプロジェクトを保管する場所です)。
-
ファイル <installdir>\dev\dotnet\bin\v4.0.30319\CacheEF\Nuget\InterSystems.Data.Entity6.4.5.0.0.nupkg をコピーして、Nuget リポジトリのディレクトリに貼り付けます。[OK] をクリックします。
-
Visual Studio で、[プロジェクト]→[Nuget パッケージの管理]→[設定]→[パッケージ マネージャー]→[パッケージ ソース] の順に選択します。
-
プラス記号 (+) をクリックします。InterSystems.Data.Entity6.4.5.0.0.nupkg を含むパスを入力します。[OK] をクリックします。
Entity Framework の開始
このセクションでは、Entity Framework を開始するための 3 つの方法を説明します。
-
Code First — データ・クラスの定義から開始し、クラス・プロパティからデータベースを生成します。
-
Database First Database First — 既存のデータベースから開始します。"サンプル・データベースの設定" セクションの手順に従うことにより、データベースを設定できます。続けて、Entity Framework を使用して、そのデータベースのフィールドに基づいて Web アプリケーションのコードを生成します。
-
Model First Model First — エンティティとリレーションシップを示すデータベース・モデルを作成することから開始します。その後、モデルからデータベースを生成します。
以下のセクションでは、これらの各方法の例が示されています。
Code First
このセクションでは、データ・クラスを定義するコードを作成し、クラス・プロパティからテーブルを生成する方法の例を示します。このセクションの例は、EntityFrameworkTutorial.net (http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspxOpens in a new tab) の Entity Framework のチュートリアルに基づいています。
-
[ファイル]→[新規作成]→[プロジェクト] の順に選択して、Visual Studio 2013 で新しいプロジェクトを作成します。Visual C# とコンソール・アプリケーションのテンプレートをハイライト表示して、プロジェクトの名前を入力します (CodeStudents など)。[OK] をクリックします。
-
Caché Entity Framework Provider をプロジェクトに追加して、[ツール]→[Nuget パッケージ マネージャ]→[ソリューション用の Nuget パッケージの管理] の順にクリックします。[オンライン]→[パッケージ ソース] の順に展開します。[Caché Entity Framework Provider 6] が表示されます。[インストール]→[OK]→[同意する] の順にクリックします。インストールの完了を待機し、[閉じる] をクリックします。
-
[ビルド]→[ソリューションのビルド] の順に選択して、プロジェクトをコンパイルします。
-
プロジェクトの接続先のシステムを App.config ファイル内で以下のように特定して、プロジェクトに指定します。[ソリューション・エクスプローラ] ウィンドウから、App.config ファイルを開きます。<entityFramework> セクションの後の <configuration> セクションの最後のセクションとして、<connectionStrings> セクション (ここに示す例と同様のもの) を追加します。
Note:サーバ、ポート、ネームスペース、ユーザ名、およびパスワードが構成に対して正しいことを確認します。
<connectionStrings> <add name="SchoolDBConnectionString" connectionString="SERVER = localhost; NAMESPACE = USER; port=1972; METADATAFORMAT = mssql; USER = _SYSTEM; password = SYS; LOGFILE = C:\\Users\\Public\\logs\\cprovider.log; SQLDIALECT = cache;" providerName="InterSystems.Data.CacheClient" /> </connectionStrings>
-
Program.cs ファイルで、以下を追加します。
using System.Data.Entity; using System.Data.Entity.Validation; using System.Data.Entity.Infrastructure;
-
クラスを定義します。
public class Student { public Student() { } public int StudentID { get; set; } public string StudentName { get; set; } public DateTime? DateOfBirth { get; set; } public byte[] Photo { get; set; } public decimal Height { get; set; } public float Weight { get; set; } public Standard Standard { get; set; } }
public class Standard { public Standard() { } public int StandardId { get; set; } public string StandardName { get; set; } public ICollection<Student> Students { get; set; } }
public class SchoolContext : DbContext { public SchoolContext() : base("name=SchoolDBConnectionString") { } public DbSet<Student> Students { get; set; } public DbSet<Standard> Standards { get; set; } }
クラス SchoolContext が App.config の接続を指していることを確認します。
-
コードを Main に追加します。
using (var ctx = new SchoolContext()) { Student stud = new Student() { StudentName = "New Student" }; ctx.Students.Add(stud); ctx.SaveChanges(); }
-
コンパイルして実行します。
ネームスペース (この場合は USER) を確認します。dbo.Standards、dbo.Students (新しい生徒が追加されています)、および dbo._MigrationHistory (テーブル作成に関する情報が含まれています) という 3 つのテーブルが作成されます。
サンプル・データベースの設定
"Database First" セクションで使用するサンプル・データベースを設定する場合は、このセクションの手順に従います。これらの手順により、サンプル・データベース CreateNorthwindEFDB.sql を設定してロードします。
-
管理ポータルで、[システム]→[構成]→[ネームスペース] の順に選択してから [新規ネームスペースの作成] をクリックします。
-
ネームスペースに NORTHWINDEF という名前を指定します。
-
[グローバルに既存のデータベースを選択] で、[新規ネームスペースの作成] をクリックします。データベースとして NORTHWINDEF と入力し、ディレクトリとして <installdir>\mgr\EFdatabase と入力します。[次] をクリックして、[完了] をクリックします。
-
[ルーチンに既存のデータベースを選択] で、ドロップダウン・リストから [NORTHWINDEF] を選択します。
-
[保存] をクリックします。
-
-
管理ポータルで、[システム]→[構成]→[SQL およびオブジェクトの設定]→[一般SQL設定] の順に選択します。
-
[SQL] タブで、[既定の SQL スキーマ名] を dbo に設定します。
-
[SQL] タブで、[区切り識別子をサポート] を選択します (既定ではオンになっています)。
-
DDL タブで、すべての項目を選択します。
-
[保存] をクリックします。
-
-
[システム]→[構成]→[SQL およびオブジェクトの設定]→[TSQL 互換性設定] の順に選択します。
-
[言語] を [MSSQL] に設定します。
-
[QUOTED_IDENTIFIER] を [オン] に設定します。
-
[保存] をクリックします。
-
-
ターミナル・ウィンドウで、以下によって新しいネームスペースに変更します。
zn “NORTHWINDEF”
-
データベースの設定が今回初めてではない場合、以下によって既存のデータを削除します。
do $SYSTEM.OBJ.DeleteAll("e") d Purge^%apiSQL()
-
まだ実行していない場合は、Unzip プログラムを使用して、installdir\dev\dotnet\bin\v4.0.30319\CacheEF.zip から CacheEF というフォルダにファイルを抽出します。
-
ddl をロードするには、以下を入力します。
do $SYSTEM.SQL.DDLImport("MSSQL","_system","<installdir>\dev\dotnet\bin\v4.0.30319\CacheEF\CreateNorthwindEFDB.sql")
[サーバ・エクスプローラ] ウィンドウで、Caché サーバ・エントリを展開することで、NorthwindEF のデータベース要素 (テーブル、ビュー、関数、プロシージャ) を表示できます。各要素を調べ、テーブルおよびビューのデータを取得し、関数およびプロシージャを実行できます。要素を右クリックして [編集] を選択すると、スタジオが開き、対応するクラスおよび要求された要素に関する場所 (該当する場合) が示されます。
Database First
Database First の方法を使用するには、既存のデータベースから開始し、Entity Framemaker を使用して、そのデータベースのフィールドに基づいて Web アプリケーションのコードを生成します。
-
[ファイル]→[新規作成]→[Visual C#] タイプの [プロジェクト]→[コンソール アプリケーション]→[OK] の順に選択して、Visual Studio 2013 で新しいプロジェクトを作成します。
-
[ツール]→[NuGet パッケージ マネージャー]→[ソリューション用の Nuget パッケージの管理] の順にクリックします。[オンライン]→[パッケージ・ソース] の順に展開します。[Caché Entity Framework Provider 6] が表示されます。[インストール]→[OK]→[ライセンスに同意する]→[閉じる] の順にクリックします。
-
[ビルド]→[ソリューションのビルド] の順に選択して、プロジェクトをコンパイルします。
-
[プロジェクト]→[新しい項目の追加]→[Visual C# アイテム]→[ADO.NET エンティティ データ モデル] の順に選択します。モデルに名前を指定します。ここでは、既定の Model1 を使用します。[追加] をクリックします。
-
[エンティティ データ モデル ウィザード] で以下の手順を実行します。
-
[データベースからの EF デザイナ]→[次へ] の順に選択します。
-
[データ接続の選択] 画面の [データ接続] フィールドは、既に Northwind データベースになっているはずです。機密データの質問に対しては、[含める] または [除外する] のどちらを選択してもかまいません。
-
画面の下部で、接続の設定名を定義できます。既定は localhostEntities です。この名前は後で使用されます。
-
[データベースのオブジェクトおよび設定の選択] 画面の [モデルにどのデータベース オブジェクトを含めますか?] という質問に、すべてのオブジェクト ([テーブル]、[ビュー]、および [ストアド・プロシージャと関数]) を選択して回答します。これには、すべての Northwind テーブルが含まれます。
-
[完了] をクリックします。
-
数秒経つと、[セキュリティに関する警告] が表示されます。[OK] をクリックし、テンプレートを実行します。
-
Visual Studio により、多くの警告が含まれたエラー・リストが表示されることがありますが、無視できます。
-
-
モデル名が Model1 の場合、Visual Studio により、Model1.edmx 下に複数のファイルが生成されます。これには、UI 図 (Model1.edmx 自体)、Model1.tt 下のテーブルを表すクラス、Model1.Context.tt→Model1.Context.cs のコンテキスト・クラス localhostEntities が含まれます。
[ソリューション・エクスプローラ] ウィンドウで、Model1.Context.cs を検査できます。コンストラクタ Constructer public localhostEntities() : base("name=localhostEntities") は、App.Config 接続文字列を指します。
<connectionStrings> <add name="localhostEntities" connectionString="metadata=res://*/Model1.csdl| res://*/Model1.ssdl| res://*/Model1.msl;provider=InterSystems.Data.CacheClient; provider connection string=" ApplicationName=devenv.exe; ConnectionLifetime=0; ConnectionTimeout=30; ConnectionReset=False; Server=localhost; Namespace=NORTHWINDEF; IsolationLevel=ReadUncommitted; LogFile=C:\Users\Public\logs\cprovider.log; MetaDataFormat=mssql; MinPoolSize=0; MaxPoolSize=100; Pooling=True; PacketSize=1024; Password=SYS; Port=1972; PreparseCacheSize=200; SQLDialect=cache; Ssl=False; SoSndBuf=0; SoRcvBuf=0; StreamPrefetch=0; TcpNoDelay=True; User=_SYSTEM; WorkstationId=DMITRY1"" providerName="System.Data.EntityClient" /> </connectionStrings>
-
[ビルド]→[ソリューションのビルド] の順に選択して、プロジェクトをコンパイルします。
以下に、Program.cs 内の Main() に貼り付けることができる 2 つのプログラムのサンプルを示します。
顧客リストは以下を使用して検索できます。
using (var context = new localhostEntities()) {
var customers = context.Customers;
foreach (var customer in customers) {
string s = customer.CustomerID + '\t' + customer.ContactName;
}
}
顧客 ID の注文リストは以下を使用して取得できます。
using (var context = new localhostEntities()) {
var customerOrders = from c in context.Customers
where (c.CustomerID == CustomerID)
select new { c, c.Orders };
foreach (var order in customerOrders) {
for (int i = 0 ; i < order.Orders.Count; i++) {
var orderElement = order.Orders.ElementAt(i);
string sProduct = "";
//Product names from OrderDetails table
for (int j = 0; j < orderElement.OrderDetails.Count; j++)
{
var product = orderElement.OrderDetails.ElementAt(j);
sProduct += product.Product.ProductName;
sProduct += ",";
}
string date = orderElement.OrderDate.ToString();
}
}
}
Model First
Model First アプローチを使用するには、"Database First" のセクションで作成した図に基づいてデータベース・モデルを生成します。その後、モデルからデータベースを生成します。
この例では、2 つのエンティティを含むデータベースを作成する方法を示します。
-
Entity Framework の UI edmx 図である Model1.edmx を確認します。図の空白領域で、右クリックして [プロパティ] を選択します。
-
[DDL 生成テンプレート] を [SSDTLtoCacheSQL.tt] に変更します。
-
プロジェクトをコンパイルします。
-
図の空白領域で、右クリックして [モデルからのデータベースの生成] を選択します。 DDL の生成後、[完了] をクリックします。
-
Studio により、ファイル Model1.edmx.sql が作成され、開かれます。
-
ターミナルで以下のコマンドを実行して、Caché にテーブル定義をインポートします。
do $SYSTEM.SQL.DDLImport("MSSQL","_system","C:\\<myPath>\\Model1.edmx.sql")