データベースの生成規則 (データベース生成ウィザード)

データベース生成ウィザードは、Table-Per-Type のマッピング方法を使用し、概念モデルからデータベース スキーマを生成します。 Table-Per-Type のマッピング方法では、各エンティティ型のすべての非継承プロパティが別々のデータベース テーブルにマップされます。 このトピックでは、データベース スキーマの生成に使用される規則について説明します。

詳細については、「方法: 概念モデルからデータベースを生成する (Entity Data Model ツール)」および「方法: データベースの生成をカスタマイズする (データベース生成ウィザード)」を参照してください。

エンティティ型およびテーブル

次の表では、エンティティ型に基づいてテーブルがどのように作成されるかについて説明します。

テーブル名

作成される列1

主キー

外部キー

非派生型

型の EntitySet 要素名。

複合型のプロパティの各スカラー プロパティを含む、各スカラー プロパティの列。

エンティティ キーのプロパティに対応する列。

下の「アソシエーションおよび外部キー」セクションを参照。

派生型

基本型の EntitySet 要素名および型名の連結。

各非継承スカラー プロパティの列 (複合型プロパティの各スカラー プロパティを含む)、および継承キー プロパティの列。

継承エンティティ キーのプロパティに対応する列。

子テーブルの主キーも、親テーブルの主キーを参照する外部キーです。

追加の外部キーを作成することもできます。 詳細については、下の「アソシエーションおよび外部キー」を参照してください。

  1. ナビゲーション プロパティに追加の列を追加することもできます。 詳細については、下の「アソシエーションおよび外部キー」を参照してください。

次の例は、下記の記述によりモデルについて生成されたデータ記述言語 (DDL) を示します。

  • Person エンティティ型 (エンティティ セット: PersonSet):

    • PersonID (キー プロパティ、Int32)

    • LastName (String)

    • FirstName (String)

  • Instructor エンティティ型 (Person より継承、継承プロパティは示しません):

    • DepartmentID (Int32)

    • OfficeLocation (String)

コード

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'PersonSet'
CREATE TABLE [PersonSet] (
      [PersonID] int  NOT NULL,
      [LastName] nvarchar(max)  NOT NULL,
      [FirstName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'PersonSet_Instructor'
CREATE TABLE [PersonSet_Instructor] (
      [DepartmentID] int  NOT NULL,
      [OfficeLocation] nvarchar(max)  NOT NULL,
      [PersonID] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [PersonID] in table 'PersonSet'
ALTER TABLE [PersonSet] WITH NOCHECK
ADD CONSTRAINT [PK_PersonSet]
      PRIMARY KEY CLUSTERED ([PersonID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [PersonID] in table 'PersonSet_Instructor'
ALTER TABLE [PersonSet_Instructor] WITH NOCHECK
ADD CONSTRAINT [PK_PersonSet_Instructor]
      PRIMARY KEY CLUSTERED ([PersonID] ASC)
    ON [PRIMARY]
GO

-- --------------------------------------------------
-- Creating All Foreign Key Constraints
-- --------------------------------------------------

-- Creating foreign key on [PersonID] in table 'PersonSet_Instructor'
ALTER TABLE [PersonSet_Instructor] WITH NOCHECK
ADD CONSTRAINT [FK_Instructor_inherits_Person]
    FOREIGN KEY ([PersonID])
    REFERENCES [PersonSet]
        ([PersonID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO

アソシエーションおよび外部キー

下の表は、アソシエーションの DDL 生成規則について説明しています。 すべてのアソシエーションについて、外部キー制約が作成されることに注意してください。

アソシエーション型 外部キー生成規則

1 対 0 または 1 (1:0..1)

または

1 対多 (1:*)

アソシエーションについて参照制約が定義されていない場合、0..1 または * のアソシエーション End のエンティティ型に対応するテーブルに列が追加されます。 追加された列には、もう一方のアソシエーション End のエンティティ型に対応するテーブルの主キーを参照する外部キー制約が設定されます。 追加されたテーブル列は、エンティティ型ではなくアソシエーションにマップされます。 追加された各列の名前は、ナビゲーション プロパティ名およびキー プロパティ名を組み合わせた名前です。

概念モデル内のアソシエーションに、参照制約が存在する場合、データベース テーブルに追加の列は追加されません。 代わりに、外部キー制約が作成されます。 データベースに作成される制約は、概念モデルの制約を反映します。概念モデル内の依存するプロパティに対応する列は、エンティティ キーに対応する主キー列を参照します。 外部キー制約の名前は、アソシエーションの名前です。 詳細については、「方法: 参照に関する制約を追加および編集する (Entity Data Model ツール)」を参照してください。

1 対 1 (1:1)

アソシエーションについて参照制約が定義されていない場合、アソシエーション End のエンティティ型に対応するテーブルの 1 つに列が追加されます。 列の追加先のテーブルは、任意に選択されます。 追加された列には、もう一方のアソシエーション End のエンティティ型に対応するテーブルの主キーを参照する外部キー制約が設定されます。 追加された列は、エンティティ型ではなくアソシエーションにマップされます。 追加された各列の名前は、ナビゲーション プロパティ名およびキー プロパティ名を組み合わせた名前です。

概念モデル内のアソシエーションに、参照制約が存在する場合、データベース テーブルに追加の列は追加されません。 代わりに、外部キー制約が作成されます。 データベースに作成される制約は、概念モデルの制約を反映します。概念モデル内の依存するプロパティに対応する列は、エンティティ キーに対応する主キー列を参照します。 外部キー制約の名前は、アソシエーションの名前です。 詳細については、「方法: 参照に関する制約を追加および編集する (Entity Data Model ツール)」を参照してください。

多対多 (*:*)

結合テーブルが作成されます。 各エンティティ型のキー プロパティごとに、列がテーブルに追加されます。 追加された列には、アソシエーション End のエンティティ型に基づいて作成されたテーブルの主キーを参照する外部キー制約が設定されます。 作成されたテーブルの主キーは、テーブルのすべての列から構成される複合主キーになります。

作成されたテーブルの名前は、AssociationSet 要素名と同じです。

次の例では、1:* アソシエーションについて生成される DDL を示します。 このモデルでは、Subject エンティティと Course エンティティの間に 1:* アソシエーションが存在します。

  • Subject エンティティ型 (エンティティ セット: SubjectSet):

    • SubjectID (キー プロパティ、Int32)

    • DepartmentID (キー プロパティ、Int32)

    • SubjectName (String)

  • Course エンティティ型 (エンティティ セット: CourseSet):

    • CourseID (キー プロパティ、Int32)

    • SectionID (キー プロパティ、Int32)

    • CourseName (String)

コード

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'SubjectSet'
CREATE TABLE [SubjectSet] (
      [SubjectID] int  NOT NULL,
      [DepartmentID] int  NOT NULL,
      [SubjectName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'CourseSet'
CREATE TABLE [CourseSet] (
      [CourseID] int  NOT NULL,
      [SectionID] int  NOT NULL,
      [CourseName] nvarchar(max)  NOT NULL,
      [Subject_SubjectID] int  NOT NULL,
      [Subject_DepartmentID] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [SubjectID], [DepartmentID] in 
-- table 'SubjectSet'
ALTER TABLE [SubjectSet] WITH NOCHECK
ADD CONSTRAINT [PK_SubjectSet]
      PRIMARY KEY CLUSTERED ([SubjectID], [DepartmentID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [CourseID], [SectionID] in table 'CourseSet'
ALTER TABLE [CourseSet] WITH NOCHECK
ADD CONSTRAINT [PK_CourseSet]
      PRIMARY KEY CLUSTERED ([CourseID], [SectionID] ASC)
    ON [PRIMARY]
GO

-- --------------------------------------------------
-- Creating All Foreign Key Constraints
-- --------------------------------------------------

-- Creating foreign key on [Subject_SubjectID], [Subject_DepartmentID]
-- in table 'CourseSet'
ALTER TABLE [CourseSet] WITH NOCHECK
ADD CONSTRAINT [SubjectCourse]
    FOREIGN KEY ([Subject_SubjectID], [Subject_DepartmentID])
    REFERENCES [SubjectSet]
        ([SubjectID], [DepartmentID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO

次の例では、*:* アソシエーションについて生成される DDL を示します。 このモデルでは、Student エンティティと Course エンティティの間に *:* アソシエーションが存在します。

  • Student エンティティ型 (エンティティ セット: StudentSet):

    • StudentID (キー プロパティ、Int32)

    • LastName (String)

    • FirstName (String)

  • Course エンティティ型 (エンティティ セット: CourseSet):

    • CourseID (キー プロパティ、Int32)

    • SectionID (キー プロパティ、Int32)

    • CourseName (String)

コード

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'StudentSet'
CREATE TABLE [StudentSet] (
      [StudentID] int  NOT NULL,
      [LastName] nvarchar(max)  NOT NULL,
      [FirstName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'CourseSet'
CREATE TABLE [CourseSet] (
      [CourseID] int  NOT NULL,
      [SectionID] int  NOT NULL,
      [CourseName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'StudentCourse'
CREATE TABLE [StudentCourse] (
      [Student_StudentID] int  NOT NULL,
      [Course_CourseID] int  NOT NULL,
      [Course_SectionID] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [StudentID] in table 'StudentSet'
ALTER TABLE [StudentSet] WITH NOCHECK
ADD CONSTRAINT [PK_StudentSet]
      PRIMARY KEY CLUSTERED ([StudentID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [CourseID], [SectionID] in table 'CourseSet'
ALTER TABLE [CourseSet] WITH NOCHECK
ADD CONSTRAINT [PK_CourseSet]
      PRIMARY KEY CLUSTERED ([CourseID], [SectionID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [Student_StudentID], [Course_CourseID],
-- [Course_SectionID] in table 'StudentCourse'
ALTER TABLE [StudentCourse] WITH NOCHECK
ADD CONSTRAINT [PK_StudentCourse]
      PRIMARY KEY CLUSTERED ([Student_StudentID], [Course_CourseID], [Course_SectionID] ASC)
    ON [PRIMARY]
GO

-- --------------------------------------------------
-- Creating All Foreign Key Constraints
-- --------------------------------------------------

-- Creating foreign key on [Student_StudentID] in table 'StudentCourse'
ALTER TABLE [StudentCourse] WITH NOCHECK
ADD CONSTRAINT [FK_StudentCourse_StudentSet]
    FOREIGN KEY ([Student_StudentID])
    REFERENCES [StudentSet]
        ([StudentID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO
-- Creating foreign key on [Course_CourseID], [Course_SectionID] in table 'StudentCourse'
ALTER TABLE [StudentCourse] WITH NOCHECK
ADD CONSTRAINT [FK_StudentCourse_CourseSet]
    FOREIGN KEY ([Course_CourseID], [Course_SectionID])
    REFERENCES [CourseSet]
        ([CourseID], [SectionID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO

次の例では、アソシエーションについて参照制約が存在する場合に 1:0..1 アソシエーションについて生成される DDL を示します。 このモデルでは、InstructorId は参照制約の主キーであり、OfficeId は依存キーです。

  • Instructor エンティティ型 (エンティティ セット: InstructorSet):

    • InstructorId (キー プロパティ、Int32)

    • LastName (String)

    • FirstName (String)

  • Office エンティティ型 (エンティティ セット: OfficeSet):

    • OfficeID (キー プロパティ、Int32)

    • Location (キー プロパティ、String)

コード

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'InstructorSet'
CREATE TABLE [InstructorSet] (
      [InstructorID] int  NOT NULL,
      [LastName] nvarchar(max)  NOT NULL,
      [FirstName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'OfficeSet'
CREATE TABLE [OfficeSet] (
      [OfficeID] int  NOT NULL,
      [Location] nvarchar(max)  NOT NULL,
      [Instructor_InstructorID] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [InstructorID] in table 'InstructorSet'
ALTER TABLE [InstructorSet] WITH NOCHECK
ADD CONSTRAINT [PK_InstructorSet]
     PRIMARY KEY CLUSTERED ([InstructorID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [OfficeID], [Location] in table 'OfficeSet'
ALTER TABLE [OfficeSet] WITH NOCHECK
ADD CONSTRAINT [PK_OfficeSet]
      PRIMARY KEY CLUSTERED ([OfficeID], [Location] ASC)
    ON [PRIMARY]
GO

-- --------------------------------------------------
-- Creating All Foreign Key Constraints
-- --------------------------------------------------

-- Creating foreign key on [Instructor_InstructorID] in 
-- table 'OfficeSet'
ALTER TABLE [OfficeSet] WITH NOCHECK
ADD CONSTRAINT [InstructorOffice]
    FOREIGN KEY ([Instructor_InstructorID])
    REFERENCES [InstructorSet]
        ([InstructorID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO

複合型および列

エンティティ型に ComplexType プロパティがある場合、ComplexType の各スカラー プロパティの列が、エンティティ型に基づいて作成されたテーブルに追加されます。 各列の名前は、ComplexType プロパティ名、アンダースコア文字 ("_")、ComplexType の対応するプロパティの名前を組み合わせた名前です。 たとえば、エンティティに EntityProperty1 という名前の ComplexType プロパティがあり、ComplexType に CTProperty1 および CTProperty2 の 2 つのスカラー プロパティがあるとします。 テーブルに追加される列は、EntityProperty1_CTProperty1 および EntityProperty1_CTProperty2 となります。

次の例では、ComplexType プロパティを持つエンティティについて生成される DDL を示します。

  • Instructor エンティティ型 (エンティティ セット: InstructorSet):

    • InstructorID (キー プロパティ、Int32)

    • LastName (String)

    • FirstName (String)

    • ContactInfo (ComplexType ContactInformation の)

  • ContactInformation ComplexType:

    • HomePhone (String)

    • CellPhone (String)

    • EmailAddress (String)

コード

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'InstructorSet'
CREATE TABLE [InstructorSet] (
      [InstructorID] int  NOT NULL,
      [LastName] nvarchar(max)  NOT NULL,
      [FirstName] nvarchar(max)  NOT NULL,
      [ContactInfo_HomePhone] nvarchar(max)  NOT NULL,
      [ContactInfo_CellPhone] nvarchar(max)  NOT NULL,
      [ContactInfo_EmailAddress] nvarchar(max)  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [InstructorID] in table 'InstructorSet'
ALTER TABLE [InstructorSet] WITH NOCHECK
ADD CONSTRAINT [PK_InstructorSet]
      PRIMARY KEY CLUSTERED ([InstructorID] ASC)
    ON [PRIMARY]
GO

ファセットおよびデータ型

ファセットは、エンティティ プロパティに対するデータ型の制約を表します。 データベース生成ウィザードは、概念スキーマ定義言語 (CSDL) で定義されたファセットについて、次の操作を行います。

  • CSDL の Property 要素から、ストア スキーマ定義言語 (SSDL) 内の対応する Property 要素に、ファセットをコピーします。

  • DDL のステートメントまたは制約にファセットを変換します。

    • MaxLengthFixedLengthPrecisionScale、および Unicode の各ファセットは、列のデータ型修飾子に変換されます。

    • Collation ファセットは COLLATE ステートメントに変換されます。

    • StoreGeneratedPattern ファセットが identity (StoreGeneratedPattern="identity") に設定されていてプロパティ型が intbigintsmallinttinyint、または decimal である場合、影響を受けるデータベースの列が IDENTITY(1,1) 仕様で作成されます。 詳細については、「Facets (CSDL)」および「方法: ファセット値を編集する (Entity Data Model ツール)」を参照してください。

Indexes

各テーブルの主キーに対して、クラスター化インデックスが作成されます。 すべてのインデックスは昇順に並んでいます。

DROP ステートメント

データベース生成ウィザードを実行したときに、ストレージ モデルが既に定義されている場合、生成された DDL には、ストレージ モデルから推論される各 EntitySet と各 AssociationSet にそれぞれ DROP TABLE ステートメントと DROP CONSTRAINT ステートメントが含まれています。

参照

概念

ADO.NET Entity Data Model デザイナー

その他のリソース

データベース生成ウィザード (Entity Data Model ツール)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications