Common Data Service のソリューション概要

Common Data Service (CDS) にはソリューションという便利な機能があります。この記事ではソリューションがどういうもので、何が嬉しいかを説明します。

# ソリューションとは

CDS には多くの要素が含まれています。ソリューションの画面から見てみると、現時点で以下のようなコンポーネントが確認でき、実際にはより多くのものが存在します。
<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/103c8b63-65c8-569d-dbc5-ebcd33bae0d7.png"/>

例えば複数のエンティティ定義やオプションセットを作成し他の環境にコピーしたい場合、個別に移すのは非常に手間ですし、どのエンティティとどのエンティティが関係あるかなどグルーピングする方法が必要です。

ソリューションを使えば、これらの要素をすべて 1 つにまとめて管理、移行することができます。

# ソリューションのタイプ

ソリューションは以下の 3 タイプがあります。

- アンマネージドソリューション : 変更ができるソリューション
- マネージドソリューション : 変更ができないソリューション
- システムソリューション : 既定で存在するソリューションでソリューション一覧にも表示されない

例えば開発環境で追加したものを本番環境に移行する場合、本番環境で勝手に変更されないようにマネージドソリューションを使います。Microsoft もこの方法で Common Data Model (CDM) の Core エンティティなどを CDS に初期登録しています。CDM については [Common Data Service で自動的に作られるエンティティについて](https://qiita.com/kenakamu/items/21f91df6c42e9a0e8e19) を参照してください。

# レイヤー

CDS では複数のソリューションが共存できるよう、異なるソリューションをレイヤーとして管理します。同じコンポーネントが複数のソリューションにある場合、上位にあるレイヤーのものがユーザーには見えます。
![](https://docs.microsoft.com/en-us/powerapps/maker/common-data-service/media/solution-layering.png)

## アンマネージドソリューションのレイヤー

アンマネージドソリューションは 1 レイヤーしかありません。また常にレイヤーの最上位に配置されます。ソリューションとしてはアンマネージドソリューションは複数作成が可能ですが、すべて同じレイヤーに配置される点が重要です。

## マネージドソリューションのレイヤー

一方マネージドソリューションはインポートした順番でレイヤー化されます。複数のソリューションが同じエンティティやフィールドをカスタマイズしている場合、最後にインポートしたものがユーザーには見えます。

## 依存関係

あるソリューションのコンポーネントを他のソリューションが参照している場合、依存が発生します。CDS では依存関係が追跡管理され、インポートや削除時に問題にならないように出来ています。

# 上書きとマージ

レイヤーされた場合の挙動は、コンポーネントによって異なります。

- 上書きされる: 表示名やエンティティのメタデータなどは上位にあるレイヤーのデータが採用される
- マージされる: フォームなどは複数のソリューションの要素がマージされる

マージされるものも完全に一致する項目については、上位レイヤーの値が表示されます。

# ソリューション削除時の動作

タイプによって動作が異なります。

## アンマネージドソリューションの削除

ソリューションの定義が削除されるだけであり、エンティティなどの要素はシステムに残ります。

## マネージドソリューションの削除

エンティティ定義やオプションセットなどすべてのコンポーネントが削除されます。またデータも同時に削除されます。

# 発行元

ソリューションがどこから発行されたものか分かるように、発行元が紐づけ得られます。発行元ではコンポーネントに付与されるプリフィクスやオプションセットのプリフィクスが設定できるため、同じ名前のカスタムエンティティを他のマネージドソリューションが持っていた場合も、競合が起きません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/605cfe35-2588-69c3-1471-c42c399e7096.png)

# データ配下で見ているもの

Power Apps の画面には「データ」セクションがあり、エンティティやオプションセットが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ebf357f5-cbbf-5212-e4de-a42b1d3c6a19.png)

これは「既定のソリューション」というアンマネージドソリューションを通してみているものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ba6e5964-cfb8-f840-37b8-76b7236757be.png)

しかし、この画面から追加したコンポーネントは「Common Data Services Default Solution」に含まれます。
以前は明示的にソリューションを作成しない場合、「既定のソリューション」に入る動作であったため、エクスポートした際に不要なコンポーネントもすべて含まれるという課題がありました。ソリューションのことをよく知らないままカスタマイズした場合にも影響を最小限にとどめられるよう、このような動作になっていますが、独自のソリューションを用意して、カスタマイズ/開発することを推奨します。

# 動作確認

最後にアンマネージドソリューションの動作確認を少しやりましょう。

1\. まずソリューションを作成。新規に作成したものはアンマネージドソリューションとなる。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e2ffc751-4e20-e96e-615c-f45b32803f80.png"/>

2\. 次に「既存のものを追加します」より「エンティティ」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e9191c0d-5acf-d3a4-93b8-8db0a7bd9a30.png)

3\.「取引先企業」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/caf9efaa-7393-bdd2-2575-201838ae252f.png)

4\. 今回はフォームをカスタマイズしたいため、「コンポーネントを選択します」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/76a7720e-ef17-50b2-7870-e4f63aa027aa.png)

5\.「フォーム」より「取引先企業」フォームを選択して「追加」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/974dfc14-6668-ebd9-7636-9f26b6fae978.png)

6\. 「取引先企業」エンティティがソリューションに追加されたことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e6ed31e0-e69e-f1ab-4516-6fe8b68ae692.png)

7\. 追加された取引先企業を開く。フォームしか追加していないため、フィールドには何も表示されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/7100f75e-17c2-ed43-0f46-ba9b7d582cd1.png)

8\.「フィールドの追加」より任意のフィールドを追加。プリフィクスとして発行元のものが指定されていることを確認。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/375bc520-6afe-653e-2fa5-142f181c4dd6.png"/>

9\. 「エンティティの保存」をクリック後、フォームより「取引先企業」を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/bcc1f9d4-d237-fdcd-f26a-e3c8083a980b.png)

10\. 先ほど追加したカスタムフィールドをフォームに追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ed1b5698-5651-0777-9c00-bce3c62e4d2a.png)

11\.「保存」して戻り、「すべてのカスタマイズの発行」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/450e69a1-bc67-3f8c-b19b-2c53037fc0a0.png)

12\. データより取引先企業を開き、フォームが更新されていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/44ad0c33-e8a8-52dd-2349-2279b43a3276.png)

この時点で取引先企業のフォームを直接更新した雰囲気はありますが、実際にはアンマネージドソリューションとしてデータベースに保存されており、既存のフォーム情報は上書きされずに残っています。

次にソリューションを削除してみます。

1\. ソリューションの一覧より「サンプルソリューション」を選択し、「削除」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/fc43ee1b-e604-5025-7812-d5849f752fc1.png)

2\. メッセージにも動作が明記されています。確認して「削除」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/dc5858e7-b1f7-6e1f-6071-b50e5cd86e88.png)

3\. ソリューション削除後もフィールドが存在することを確認。

4\. 発行元が異なるため、「Common Data Services Default Solution」には含まれない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/06bf21a6-b50e-df33-653f-1cc68a9584bd.png)

5\.「既定のソリューション」からは確認出来ることとプリフィクスが変わっていないことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a21866f5-c8a4-4355-fdea-8d4b02784718.png)

# まとめ

ソリューションは管理面や他環境の移行時に必須の機能となります。別の記事でバージョン管理なども触れたいと思いますが不明点があればコメントしてください。

# 参照

[ソリューションの概要](https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/solutions-overview)