数据库生成规则(“生成数据库”向导)

“生成数据库”向导通过使用每种类型一个表映射策略根据概念模型生成数据库架构。 每种类型一个表映射策略是将每种实体类型上的所有非继承属性映射到不同的数据库表的映射策略。 本主题描述用于生成数据库架构所使用的规则。

有关更多信息,请参见如何:根据概念模型生成数据库(实体数据模型工具)如何:自定义数据库生成(“生成数据库”向导)

实体类型和表

下表描述如何基于实体类型创建表:

表名

创建的列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)

如果没有对关联定义引用约束,则会向与关联的两端上实体类型对应的其中一个表中添加列。 向其中添加列的表是任意选择的。 添加的列具有外键约束,这些约束引用与另一关联端上的实体类型对应的表的主键。 添加的列映射到关联,而非实体类型。 每个添加的列的名称都是导航属性名称和键属性名称的串联。

如果在概念模型中关联存在引用约束,则不会向数据库表中添加任何其他列, 而是会创建一个外键约束。 在数据库中创建的约束镜像概念模型中的约束:与概念模型中的依赖属性对应的列引用与实体键对应的主键列。 外键约束的名称就是关联的名称。 有关更多信息,请参见如何:添加和编辑引用约束(实体数据模型工具)

多对多 (*:*)

创建一个联接表。 针对每个实体类型中的每个键属性,向表中添加一列。 这些列具有外键约束,这些约束引用基于关联两端上的实体类型创建的表中的主键。 所创建的表的主键将是一个复合主键,它由表中的所有列组成。

创建的表的名称与 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。 向表中添加的列将为 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 中的语句或约束:

    • MaxLengthFixedLengthPrecisionScaleUnicode 方面转换为列上的数据类型修饰符。

    • Collation 方面转换为一个 COLLATE 语句。

    • 如果 StoreGeneratedPattern 方面设置为 identity (StoreGeneratedPattern="identity") 并且属性类型为 intbigintsmallinttinyintdecimal,则将使用 IDENTITY(1,1) 规范创建受影响的数据库列。 有关更多信息,请参见Facets (CSDL)如何:编辑方面值(实体数据模型工具)

索引

在主键上为每个表创建聚集索引。 所有索引按升序排序。

DROP 语句

如果在运行“生成数据库”向导时已定义一个存储模型,那么,在生成的 DDL 中,从该存储模型推导出的每个 EntitySet 有一个 DROP TABLE 语句,每个 AssociationSet 则有一个 DROP CONSTRAINT 语句。

另请参见

概念

ADO.NET 实体数据模型设计器

其他资源

“生成数据库”向导(实体数据模型工具)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications