xConnect モデル
xConnect モデルは、xConnect が収集するデータの構造とタイプを表します。xConnect モデルは以下を定義します。
-
コンタクトおよびインタラクションのファセット (
PersonalInformation
やIpInfo
など) -
イベントタイプ (
Goal
やOutcome
など) -
ファセットやイベントで使用される、すべての CLR タイプ (
System.String
など) またはカスタム クラス
xConnect モデルは、複数のより小さな部分モデルで構成されています。xConnect サービスは、モデル全体を認識します。CRM システムなどのクライアントは、それが使用する部分モデルのみを認識する必要があります。xConnect にデプロイされていないモデルを使用することはできません。
xConnect はすべての部分モデルの JSON バージョンをホストする
xConnect 内では、すべてのモデルの JSON 表現を \App_data\Models
フォルダーに含める必要があります。新しいモデルを作成したら、xConnect にデプロイしてから使用する必要があります。xConnect バージョンのモデルは、優先するバージョンと見なされます。xConnect クライアント API の初期化時に、クライアント側のすべてのモデルは、xConnect バージョンに対して検証されます。クライアントのモデルの以下のプロパティは xConnect モデルと一致する必要があります。
-
モデル名
-
モデル バージョン
-
ファセット、イベント、およびタイプ
クライアントは必要なモデルを参照する
クライアントは、使用するモデル DLL のコピーを持っている必要があります。次の例で、CRM サーバーは Documentation.Model モデルのみを認識します。Content Delivery サーバーは Documentation.Model とデフォルトの Sitecore モデルを認識します。
Content Management や Content Delivery などの Sitecore の主要なロールは、設定されたモデルのリストからランタイム モデルを構築します。Sitecore 以外のコンテキストで xConnect クライアント APIを使用する場合は、必要なモデルを使用してクライアントをインスタンス化する必要があります。詳細については、以下を参照してください。
型の制限
次の制限は、ファセットやイベントのプロパティ型など、モデルで使用されるすべての型に適用されます。
-
.RegisterType<T>
で登録できるのは、オブジェクト型と列挙型のみです。List<string>
を追加することはできません。 -
すべての型にはパラメーターなしのコンストラクターが必要です。コンストラクターはパブリックである必要はありません。
-
コレクションには具象型
List<T>
を使用します。 -
ディクショナリには具象型
Dictionary<K,V>
を使用します。 -
型は、参照されるスキーマ全体で一意である必要があります。これは
.RegisterType<T>
で型を手動で登録する場合を除き、通常は問題になりません。 -
プロパティには null を使用できます。例:
public?intLoyaltyNumber
。
モデル ビルダーは、常に Facet
や Event
などのコアの型を登録します。これには、Goal
や Outcome
などの Event
を継承するすべての組み込み型が含まれます。
ファセットやカスタム イベントの List<T>
プロパティを null に設定すると、そのリスト プロパティは、再度読み取られたときに null ではなく空になります。このコンテキストでは、oData は null 値をサポートしません。コレクション データベースで値が null であっても同様です。ただし、RelatedInteractionExpandOptions
が指定されていない場合、Contact
の Interactions
プロパティは null を返します。oData コンテキストでは、コンタクトとインタラクションは関連するエンティティです。
命名規則
次の命名規則は、タイプ名、プロパティ名、列挙型、ファセット キー、およびモデル名に適用されます。
-
小文字または大文字の英字で始まること
-
最初の文字に続けて、大文字または小文字の英字、数字、またはアンダースコアの任意の組み合わせを使用できる
モデル名と名前空間には、複数の識別子をドットで区切って含めることができます。例: My.Name_Space0 または My.Model_Name1。
ファセットとイベントの一意性
ファセットとイベントは、モデル内および参照モデル間で一意である必要があります。ファセットの一意性は、次の組み合わせによって決定されます。
-
ファセット タイプ
-
ファセット キー
-
ファセット エンティティ (
Contact
またはInteraction
のいずれか)
ファセットは、コンタクトとインタラクションに対して同じタイプとキーを使用して定義できます。
modelBuilder.DefineFacet<Contact, FacetType>("FacetKey");
modelBuilder.DefineFacet<Interaction, FacetType>("FacetKey");
イベントはタイプで定義します。2 つのモデルが 1 つのイベント タイプを共有する場合、このイベント タイプを個別の共有モデルで指定されていない限り、両方のモデルを一緒に使用することはできません。次の例では、Documentation.Model.dll と Testing.Model.dll の両方で、RegisterEvent という名前のイベントを定義しています。
Documentation.Model.dll と Testing.Model.dll を一緒に使用するには、Documentation.Model.dll と Testing.Model.dll が参照する別個のモデルに共有イベント タイプを移動する必要があります。
参照されるモデル間でのモデル名の一意性
モデル名は、 すべての参照されるモデル (2 次参照を含む) 間で一意である必要があります。次に例を示します。
-
CRM.Model というモデルが CRM.Model という別のモデルを参照することはできません。
-
CRM.Model というモデルを参照している Documentation.Model が CRM.Model という別のモデルを参照することはできません。
モデル名が一意でない場合は、DuplicateModelNameException
例外がスローされます。次の例は DuplicateModelNameException
になります。
var model1 = new XdbModel("Test", new XdbModelVersion(0, 1), new XdbNamedType[0], new XdbFacetDefinition[0], new XdbModel[0]);
var model2 = new XdbModel("Test", new XdbModelVersion(0, 1), new XdbNamedType[0], new XdbFacetDefinition[0], new XdbModel[0]);
var model3Builder = new XdbModelBuilder("Composite", new XdbModelVersion(0, 1));
model3Builder.ReferenceModel(model2);
model3Builder.BuildModel(); // This will work, since only one model named "Test"
model3Builder.ReferenceModel(model1);
model3Builder.BuildModel(); // This will fail, as there is already a model named "Test"