複雑怪奇なDataverseのエンティティセット名の謎に迫る
はじめに
みなさん、Dataverse使っていますか?
私は使っていません!
ただ、たまに開発することがあり、そこで盛大に引っ掛かったので共有します。
Dataverseとは
Dataverseは、Microsoft Power Platform上で利用できるデータ管理基盤の一つです。
Power Apps、Power Automate、Power BIなどから容易にアクセスできるため、Power Appsをメインで使用する場合はこちらを使うことになるかと思います。
外部からAPIでアクセスすることもでき、結構便利に使う事が出来ます。
(Entra IDなどでアプリ登録する必要があったりしますが)
エンティティセットとは
Dataverseではテーブルでデータを管理しますが、テーブルに対しAPIでアクセスする際は「エンティティセット名」を使用してアクセスします。
「エンティティセット名」はテーブル名が何故か複数形に変化し、先頭にプレフィックスが付いたりつかなかったりします。(プレフィックスも環境によって異なるので気を付けてください。)
testテーブルの場合
例えば先頭にnewというプレフィックスが付き、testが複数形になるので
new_testsというエンティティセット名になります。
この「エンティティセット名」はテーブル名を元に生成され、主にODataエンドポイントで利用されます。
簡単に言えばAPIでtestテーブルにアクセスする場合、/api/data/v9.2/new_testsにアクセスする必要があるという事です。
Dataverseの落とし穴
さて、ここまで聞くと単にテーブル名に対してプレフィックスとsを付ければいいだけと思うかもしれません。
というか自分はそう思ってコードを書いていました。
実際、testテーブルではうまく動いていたのですが。。。
お客様から動作しないと報告がありました。
複数形の罠
なぜかそのテーブルだけ動きませんでした。
自社環境でデータ列をそろえてテストしても再現しません。
諸々確認してみると、エンティティセット名が違うことが解りました。
仮に、お客様環境のテーブル名をcountryというものだったとしておきます。
問題のエンティティセット名は。。。
new_countries
そう、規則変化していました。
どこまで適用されるの?
話はそこまでなのですが、ここで一つ気になったことがあります。
エンティティセットは基本的に自動生成です。
ということは、複数形に変えているのはなんらかの操作をしていることになります。
ルールベースなのか、はたまた生成AIでも裏で動いているのか・・・
どこまで変形するのか確かめてみました。
bus
busは規則変化で最後にsが付くため、busesを期待したいです。
new_buses
country
countryは例示したものですね、「yをiに変えてes」と中学教師の顔と一緒に思い浮かびました。
new_countries
knife
feで終わる場合はvesになる。そういえばそんなルールもありました。
new_knifes
あれ?これは変化しないんですね。
man
不規則変化といえば、おそらく真っ先に出てくるmanです。
本来であればmenに変化しますが
new_mans
music
では逆に不可算名詞だとどうでしょうか。
期待したい動きとしてはmusicそのままになります。
new_musics
まとめ
というわけでDataverseの複数形の変化ルールはes系だけっぽい感じでした。
ただ他にも例外があるかもしれません。
APIコールする場合は安易にルールベースで変更せず、テーブル名とエンティティセット名を分けて管理するのが賢いかもしれません。
ちなみにエンティティセット名はここから確認できます。
Discussion