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に指定することで、より利用しやすいデータを取得することができるようになります。是非活用してください。