エンティティ キー (Entity Data Model)
エンティティ キーとは、ID を確認するために使用するエンティティ型のプロパティまたは一連のプロパティです。 エンティティ キーを構成するプロパティは、デザイン時に選択されます。 エンティティ キー プロパティの値は、実行時にエンティティ セット内でエンティティ型のインスタンスを一意に識別する必要があります。 エンティティ キーを構成するプロパティには、エンティティ セット内で各インスタンスの一意性を保証できるものを選択する必要があります。
エンティティ キーを構成する一連のプロパティには、次の要件があります。
エンティティ セット内では、2 つ以上のエンティティ キーを同じにすることができません。 つまり、エンティティ セット内の 2 つのエンティティに対して、キーを構成するすべてのプロパティの値を同じにすることができません。 ただし、エンティティ キーを構成する一部 (すべてではなく) の値は同じにすることができます。
エンティティ キーは、null 値が許可されない不変プリミティブ型のプロパティで構成する必要があります。
エンティティ型のエンティティ キーを構成するプロパティは、変更できません。 エンティティ型に対して複数のエンティティ キーを許可することはできません。代理キーはサポートされていません。
エンティティが継承階層に含まれる場合、ルート エンティティには、エンティティ キーを構成するすべてのプロパティを含める必要があり、そのエンティティ キーをルート エンティティ型に定義する必要があります。 詳細については、「Entity Data Model: 継承」を参照してください。
例
下のダイアグラムは、Book、Publisher、および Author という 3 つのエンティティ型の概念モデルを示しています。 各エンティティ型のエンティティ キーを構成するプロパティには、"(キー)" と示されています。 Author エンティティ型には、Name と Address の 2 つのプロパティで構成されるエンティティ キーが含まれます。
ADO.NET Entity Framework では、概念スキーマ定義言語 (CSDL) と呼ばれるドメイン固有言語 (DSL) を使用して概念モデルを定義します。 次の CSDL は、上のダイアグラムに示された Book エンティティ型を定義します。 エンティティ キーは、エンティティ型の ISBN プロパティを参照して定義されています。
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
国際標準図書番号 (ISBN) は書籍を一意に識別するものであるため、ISBN プロパティは、エンティティ キーに適しています。
次の CSDL は、上のダイアグラムに示された Author エンティティ型を定義します。 エンティティ キーは、Name と Address の 2 つのプロパティで構成されています。
同じ名前の 2 人の著者が同じ住所に住む可能性は低いため、エンティティ キーに Name および Address を使用するのは妥当な選択になります。 ただし、エンティティ キーのこの選択では、エンティティ セット内のエンティティ キーの一意性を絶対的に保証することはできません。 この場合には、AuthorId などのプロパティを追加して、著者を一意に識別することが推奨されます。