エンティティ キー
"エンティティ キー" とは、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 つのプロパティで構成されています。
<EntityType Name="Author">
<Key>
<PropertyRef Name="Name" />
<PropertyRef Name="Address" />
</Key>
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
FromRole="Author" ToRole="Book" />
</EntityType>
同じ名前の 2 人の著者が同じ住所に住む可能性は低いため、エンティティ キーに Name
および Address
を使用するのは妥当な選択になります。 ただし、エンティティ キーのこの選択では、エンティティ セット内のエンティティ キーの一意性を絶対的に保証することはできません。 この場合には、AuthorId
などのプロパティを追加して、著者を一意に識別することが推奨されます。