Entity Framework Provider の使用法
Entity Framework は、.NET 開発者がドメイン固有オブジェクトを使用してリレーショナル・データを処理できるようにするオブジェクト・リレーショナル・マッパです。これにより、開発者が通常記述する必要があるデータ・アクセス・コードの大半が必要なくなります。InterSystems Entity Framework Provider では、Entity Framework 6 テクノロジを使用してインターシステムズ・データベースにアクセスできます (Entity Framework 5 を使用している場合は、インターシステムズの担当者にお問い合わせください)。.NET Entity Framework の詳細は、http://www.asp.net/entity-frameworkOpens in a new tab を参照してください。
Entity Framework のシステム要件、インストール、および設定の詳細は、“構成と要件” の章の “Entity Framework Provider の設定” を参照してください。
この章では、Entity Framework を開始するための 3 つの方法を説明します。
-
Code First — データ・クラスの定義から開始し、クラス・プロパティからデータベースを生成します。
-
Database First — 既存のデータベースから開始し、Entity Framemaker を使用して、そのデータベースのフィールドに基づいて Web アプリケーションのコードを生成します。
-
Model First — エンティティとリレーションシップを示すデータベース・モデルを作成することから開始し、モデルからデータベースを生成します。
以下のセクションでは、これらの各方法の例が示されています。
Code First
このセクションでは、データ・クラスを定義するコードを作成してクラス・プロパティからテーブルを生成する方法の例を示します。
-
[ファイル]→[新規作成]→[プロジェクト] の順に選択して、Visual Studio 2013 で新しいプロジェクトを作成します。Visual C# とコンソール・アプリケーションのテンプレートをハイライト表示して、プロジェクトの名前を入力します (CodeStudents など)。[OK] をクリックします。
-
InterSystems Entity Framework Provider をプロジェクトに追加して、[ツール]→[NuGet パッケージ マネージャー]→[ソリューションの NuGet パッケージの管理] の順にクリックします。[オンライン]→[パッケージ ソース] の順に展開します。[InterSystems Entity Framework Provider 6] が表示されます。[インストール]→[OK]→[同意する] の順にクリックします。インストールの完了を待機し、[閉じる] をクリックします。
-
[ビルド]→[ソリューションのビルド] の順に選択して、プロジェクトをコンパイルします。
-
プロジェクトの接続先のシステムを App.config ファイル内で以下のように特定して、プロジェクトに指定します。[ソリューション・エクスプローラ] ウィンドウから、App.config ファイルを開きます。<entityFramework> セクションの後の <configuration> セクションの最後のセクションとして、<connectionStrings> セクション (ここに示す例と同様のもの) を追加します。
Note:
サーバ、ポート、ネームスペース、ユーザ名、およびパスワードが構成に対して正しいことを確認します。
<connectionStrings>
<add
name="SchoolDBConnectionString"
connectionString="SERVER = localhost;
NAMESPACE = USER;
port=51774;
METADATAFORMAT = mssql;
USER = _SYSTEM;
password = SYS;
LOGFILE = C:\\Users\\Public\\logs\\cprovider.log;
SQLDIALECT = iris;"
providerName="InterSystems.Data.IRISClient"
/>
</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
以下の例で使用しているデータベースの設定方法は、この章の最後にある “サンプル・データベースの設定” を参照してください。
Database First の方法を使用するには、既存のデータベースから開始し、Entity Framemaker を使用して、そのデータベースのフィールドに基づいて Web アプリケーションのコードを生成します。
-
[ファイル]→[新規作成]→[Visual C#] タイプの [プロジェクト]→[コンソール アプリケーション]→[OK] の順に選択して、Visual Studio 2013 で新しいプロジェクトを作成します。
-
[ツール]→[NuGet パッケージ マネージャー]→[ソリューションの NuGet パッケージの管理] の順にクリックします。[オンライン]→[パッケージ ソース] の順に展開します。[InterSystems Entity Framework Provider 6] が表示されます。[インストール]→[OK]→[ライセンスに同意する]→[閉じる] の順にクリックします。
-
[ビルド]→[ソリューションのビルド] の順に選択して、プロジェクトをコンパイルします。
-
[プロジェクト]→[新しい項目の追加]→[Visual C# アイテム]→[ADO.NET エンティティ データ モデル] の順に選択します。モデルに名前を指定します。ここでは、既定の Model1 を使用します。[追加] をクリックします。
-
[Entity Data Model ウィザード] で以下の手順を実行します。
-
[データベースからの 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.IRISClient;
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=51774;
PreparseIrisSize=200;
SQLDialect=iris;
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 生成テンプレート] を SSDTLtoIrisSQL.tt に変更します。
-
プロジェクトをコンパイルします。
-
図の空白領域で、右クリックして [モデルからのデータベースの生成] を選択します。 DDL の生成後、[完了] をクリックします。
-
Studio により、ファイル Model1.edmx.sql が作成され、開かれます。
-
ターミナルで以下のコマンドを実行して、インターシステムズにテーブル定義をインポートします。
do $SYSTEM.SQL.Schema.ImportDDL("MSSQL","_system","C:\\<myPath>\\Model1.edmx.sql")
サンプル・データベースの設定
“Database First” セクションで使用するサンプル・データベースを設定する場合は、このセクションの手順に従います。これらの手順により、サンプル・データベース CreateNorthwindEFDB.sql を設定してロードします。
-
管理ポータルで、[システム]→[構成]→[ネームスペース] の順に選択してから [新規ネームスペースの作成] をクリックします。
-
ネームスペースに NORTHWINDEF という名前を指定します。
-
[グローバルに既存のデータベースを選択] で、[新規データベース作成] をクリックします。データベースとして NORTHWINDEF と入力し、ディレクトリとして <installdir>\mgr\EFdatabase と入力します。[次] をクリックして、[完了] をクリックします。
-
[ルーチンに既存のデータベースを選択] で、ドロップダウン・リストから [NORTHWINDEF] を選択します。
-
[保存] をクリックします。
-
管理ポータルで、[システム]→[構成]→[SQL およびオブジェクトの設定]→[一般SQL設定] の順に選択します。
-
[SQL] タブで、[既定の SQL スキーマ名] を dbo に設定します。
-
[SQL] タブで、[区切り識別子をサポート] を選択します (既定ではオンになっています)。
-
DDL タブで、すべての項目を選択します。
-
[保存] をクリックします。
-
[システム]→[構成]→[SQL およびオブジェクトの設定]→[TSQL 互換性設定] の順に選択します。
-
[言語] を [MSSQL] に設定します。
-
[QUOTED_IDENTIFIER] を [オン] に設定します。
-
[保存] をクリックします。
-
ターミナル・ウィンドウで、以下によって新しいネームスペースに変更します。
set $namespace=“NORTHWINDEF”
-
データベースの設定が今回初めてではない場合、以下によって既存のデータを削除します。
do $SYSTEM.OBJ.DeleteAll("e")
do $SYSTEM.SQL.Purge()
-
まだ実行していない場合は、Unzip プログラムを使用して、installdir\dev\dotnet\bin\v4.0.30319\IrisEF.zip から IrisEF というフォルダにファイルを抽出します。
-
ddl をロードするには、以下を入力します。
do $SYSTEM.SQL.DDLImport("MSSQL","_system","<installdir>\dev\dotnet\bin\v4.0.30319\IrisEF\CreateNorthwindEFDB.sql")
[サーバ・エクスプローラ] ウィンドウで、インターシステムズ・サーバ・エントリを展開することで、NorthwindEF のデータベース要素 (テーブル、ビュー、関数、プロシージャ) を表示できます。各要素を調べ、テーブルおよびビューのデータを取得し、関数およびプロシージャを実行できます。要素を右クリックして [編集] を選択すると、スタジオが開き、対応するクラスおよび要求された要素に関する場所 (該当する場合) が示されます。