ADO.NET Data Servicesの中身
続いてData Servicesの作成ですが、その前にホスト先を固定するためにポートの設定を行います。ソリューション エクスプローラのプロジェクト上で右クリックし、[プロパティ]を選択します。[Web]タブ-[サーバー]カテゴリ-[ポートの指定をする]を選択し、テキストボックスに''50000''と設定します。
ポートの設定が終わった後、ソリューション エクスプローラ上で右クリックし、[新しい項目の追加]を選択します。選択後[新しい項目の追加]ダイアログが表示されるので、テンプレートとして「ADO.NET Data Service」を選択し、名前を「PubsAstoria.svc」と設定後[追加]ボタンをクリックします(図8)。
Data Servicesを作成すると、以下の構文が自動生成されます。太字の部分が開発者が自分で記述する部分です。
public class PubsAstoria : DataService<Model.pubsEntities>
{
public static void InitializeService(IDataServiceConfiguration config)
{
// TODO: 表示や更新などが可能なエンティティ セットおよびサービス操作を示す規則を設定してください
// 例:
config.SetEntitySetAccessRule("*", EntitySetRights.All);
// config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
// config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
}
}
InitializeServiceメソッドはサービス呼び出し時にポリシーを初期化するために一度呼び出されるメソッドです。ここで、権限、リクエストの制限、型の登録、エラー処理結果等を設定します。
InitializeServiceメソッドのパラメータには、Data Servicesの動作を設定するIDataServiceConfigurationインターフェイスが利用されます。
SetEntitySetAccessRuleメソッドは第1パラメータにString型でEDM内のアクセス可能なエンティティ型を設定し(*は全てのテーブル。具体的にアクセスしたいテーブルのみを指定することも可能)、第2パラメータにEntitySetRights列挙体の中からエンティティ型に対する権限を設定します。
EntitySetRights列挙体は以下のような権限があります。
| メンバ名 | 概要 |
| None | データへのアクセスを拒否 |
| ReadSingle | 単一のデータ項目の読み取りのみ許可 |
| ReadMultiple | データ セットの読み取りのみ許可 |
| WriteAppend | 新しいデータ項目をデータ セットに作成許可 |
| WriteReplace | データの置換許可 |
| WriteDelete | データ セットからデータ項目の削除許可 |
| WriteMerge | データをマージする許可 |
| AllRead | データ読み取り許可 |
| AllWrite | データ書き込み許可 |
| All | データの作成、読み取り、更新、削除の全てを許可 |
サンプルでは、EDMの全てのエンティティ型を表示させるために「*」を、全ての項目を許可するAllを設定しています。以上で、Data Services側の設定は完了です。デバッグ実行すると、図1の様な画面が表示されます。生成されるソースは以下の通りです。
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xml:base="http://localhost:50000/PubsAstoria.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">titles</title>
<id>http://localhost:50000/PubsAstoria.svc/titles/</id>
<updated>2008-11-19T06:06:19Z</updated>
<link rel="self" title="titles" href="titles" />
<entry>
<id>http://localhost:50000/PubsAstoria.svc/titles('BU1032')</id>
<title type="text" />
<updated>2008-11-19T06:06:19Z</updated>
<author>
<name />
</author>
<link rel="edit" title="titles" href="titles('BU1032')" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/publishers" type="application/atom+xml;type=entry" title="publishers" href="titles('BU1032')/publishers" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/roysched" type="application/atom+xml;type=entry" title="roysched" href="titles('BU1032')/roysched" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/sales" type="application/atom+xml;type=feed" title="sales" href="titles('BU1032')/sales" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/titleauthor" type="application/atom+xml;type=feed" title="titleauthor" href="titles('BU1032')/titleauthor" />
<category term="pubsModel.titles" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:advance m:type="Edm.Decimal">5000.0000</d:advance>
<d:notes>An overview of available database systems with emphasis on common business applications. Illustrated.</d:notes>
<d:price m:type="Edm.Decimal">19.9900</d:price>
<d:pubdate m:type="Edm.DateTime">1991-06-12T00:00:00</d:pubdate>
<d:royalty m:type="Edm.Int32">10</d:royalty>
<d:title>The Busy Executive's Database Guide</d:title>
<d:title_id>BU1032</d:title_id>
<d:type xml:space="preserve">business</d:type>
<d:ytd_sales m:type="Edm.Int32">4095</d:ytd_sales>
</m:properties>
</content>
</entry>
<中略>
</feed>
entryごとにレコードが区切られているため、レコードの数だけentryタグが生成されています。また、各レコードから次のフィードへのリンクが書きこまれているのも確認できます。上記コードでは''http://localhost:50000/PubsAstoria.svc/titles('BU1032')''がそれにあたります。実際にリクエストを行うと以下のフィードが返されます。
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<entry xml:base="http://localhost:50000/PubsAstoria.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<id>http://localhost:50000/PubsAstoria.svc/titles('BU1032')</id>
<title type="text" />
<updated>2008-11-19T06:23:16Z</updated>
<author>
<name />
</author>
<link rel="edit" title="titles" href="titles('BU1032')" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/publishers" type="application/atom+xml;type=entry" title="publishers" href="titles('BU1032')/publishers" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/roysched" type="application/atom+xml;type=entry" title="roysched" href="titles('BU1032')/roysched" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/sales" type="application/atom+xml;type=feed" title="sales" href="titles('BU1032')/sales" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/titleauthor" type="application/atom+xml;type=feed" title="titleauthor" href="titles('BU1032')/titleauthor" />
<category term="pubsModel.titles" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:advance m:type="Edm.Decimal">5000.0000</d:advance>
<d:notes>An overview of available database systems with emphasis on common business applications. Illustrated.</d:notes>
<d:price m:type="Edm.Decimal">19.9900</d:price>
<d:pubdate m:type="Edm.DateTime">1991-06-12T00:00:00</d:pubdate>
<d:royalty m:type="Edm.Int32">10</d:royalty>
<d:title>The Busy Executive's Database Guide</d:title>
<d:title_id>BU1032</d:title_id>
<d:type xml:space="preserve">business</d:type>
<d:ytd_sales m:type="Edm.Int32">4095</d:ytd_sales>
</m:properties>
</content>
</entry>
''http://localhost:50000/PubsAstoria.svc/titles('BU1032')''の('BU1032')はtitlesテーブルの主キーの値で、これ以上たどることはできないため、この先のリンクがフィード内に記述されていません。
Data ServicesはURIに追加でオプションを設定することもできます。現在実装されているオプションは以下の表の通りです。
| オプション | 概要 | 例 |
| $expand | 返されるフィードが展開されるかインラインとして返されるかを設定 | http://localhost:50000/PubsAstoria.svc/publishers?$expand=city |
| $filter | 指定された引数を満たすエンティティのみを返す | /PubsAstoria.svc/publishers?$filter=city eq 'Boston' |
| $orderby | エンティティを昇順または降順でソート | /PubsAstoria.svc/publishers?$orderby=city |
| $skip | 指定した個数のレコードをスキップし、それ以降のレコードを返す | /PubsAstoria.svc/publishers?$skip=1 |
| $top | 最初のレコードから、指定した個数のレコードまでを返す | /PubsAstoria.svc/publishers?$top=2 |
こちらも併せてURIに指定することで、より利用しやすいデータを取得することができるようになります。是非活用してください。


