在EF设计器中,您可以创建一个名为
answer的实体,然后创建从answer派生的实体,名为
geographyswer
,
entertainmentanswer
,…在应答实体中使用鉴别器。添加
问题
实体。将关联从问题添加到
answer
,标记为1:1。让ef为您的数据库生成ddl。
现在,您可以执行
question.answer
以获取
answer
for a
question
。您可以查看
answer
的类型,并显示相应的用户界面。
尽管如此,这也引出了一个问题,如果问题和答案之间是1:1的对应关系,为什么不让一个实体
questunswer->code>and derive s from that to create
questunswergeography->code>,
questunswerentertainment->code>,…现在,您可以轻松地选择特定类型的
问题:
dataContext.QuestUnswers.of type<QuestUnswergeography>().
for example.
下面是一个可由多个问题共享答案的案例的实体图:
此模型将允许您执行如下查询:
var geography questions=objectcontext.answers.oftype<geography>().selectmany(answer=>answer.questions);
< /代码>
此模型生成的DDL是:-
创建“答案”表
创建表[dbo]。[answers]。(
[id]int标识(1,1)不为空
;
去
--创建“问题”表
创建表[dbo]。[questions](
[id]int标识(1,1)不为空,
[answerid]int不为空,
[问题文本]nvarchar(max)不为空
;
去
--创建“答案\地理”表
创建表[dbo]。[answers_geography]。(
[placename]nvarchar(max)不为空,
[latlong]nvarchar(max)不为空,
[id]int不为空
;
去
--创建“答案\娱乐”表
创建表[dbo]。[answers\u entertainment](
[名称]nvarchar(max)不为空,
[Bornon]日期时间为空,
[diedon]日期时间为空,
[id]int不为空
;
去
--————————————————————————————————————————————————————————————————————————————————————————————————————————————---
--创建所有主键约束
--————————————————————————————————————————————————————————————————————————————————————————————————————————————---
--在“答案”表中的[ID]上创建主键
更改表[dbo]。[answers]
添加约束[pk_answers]
主键聚集([id]asc);
去
--在“问题”表中的[ID]上创建主键
更改表[dbo]。[问题]
添加约束[pk_问题]
主键聚集([id]asc);
去
--在“答案\地理位置”表中的[ID]上创建主键
更改表[DBO]。[答案\地理位置]
添加约束[pk_answers_geography]
主键聚集([id]asc);
去
--在“答案\娱乐”表中的[ID]上创建主键
更改表[DBO]。[回答娱乐]
添加限制[pk_answers_entertainment]
主键聚集([id]asc);
去
--————————————————————————————————————————————————————————————————————————————————————————————————————————————---
--创建所有外键约束
--————————————————————————————————————————————————————————————————————————————————————————————————————————————---
--在“问题”表中的[answerid]上创建外键
更改表[dbo]。[问题]
添加约束
外键([answerid])
参考文献[DBO]。[答案]
[(ID])
删除时不执行任何操作更新时不执行任何操作;
--正在为外键“fk_questunswer”创建非聚集索引
创建索引[ix fk_Questunswer]
关于[DBO]。[问题]
([答案]);
去
--在“答案\地理位置”表中的[ID]上创建外键
更改表[DBO]。[答案\地理位置]
添加约束[fk_geography_inherits_answer]
外键([id])
参考文献[DBO]。[答案]
[(ID])
删除时不执行任何操作更新时不执行任何操作;
去
--在“答案\娱乐”表中的[ID]上创建外键
更改表[DBO]。[回答娱乐]
添加约束[FK_Entertainment_Inherits_Answer]
外键([id])
参考文献[DBO]。[答案]
[(ID])
删除时不执行任何操作更新时不执行任何操作;
去
< /代码>
然后创建从名为GeographyAnswer
,EntertainmentAnswer
,…使用鉴别器AnswerType
在应答实体中. 添加Question
实体。将问题中的关联添加到回答
,标记为1:1。让ef为数据库生成DDL。
现在你可以做question.Answer
得到回答
对于一个问题
. 你可以看看回答
并显示相应的用户界面。
然而,这也引出了一个问题,如果问题和答案之间是1:1的对应关系,为什么不有一个单独的实体呢?QuestionAnswer
从中衍生出QuestionAnswerGeography
,QuestionAnswerEntertainment
,…现在你可以选择Questions
特别类型的:dataContext.QuestionAnswers.ofType<QuestionAnswerGeography>()
例如。
下面是一个可由多个问题共享答案的案例的实体图:
此模型将允许您执行如下查询:
var geographyQuestions = objectContext.Answers.OfType<Geography>().SelectMany(answer => answer.Questions);
此模型生成的DDL为:
-- Creating table 'Answers'
CREATE TABLE [dbo].[Answers] (
[Id] int IDENTITY(1,1) NOT NULL
);
GO
-- Creating table 'Questions'
CREATE TABLE [dbo].[Questions] (
[Id] int IDENTITY(1,1) NOT NULL,
[AnswerId] int NOT NULL,
[QuestionText] nvarchar(max) NOT NULL
);
GO
-- Creating table 'Answers_Geography'
CREATE TABLE [dbo].[Answers_Geography] (
[PlaceName] nvarchar(max) NOT NULL,
[LatLong] nvarchar(max) NOT NULL,
[Id] int NOT NULL
);
GO
-- Creating table 'Answers_Entertainment'
CREATE TABLE [dbo].[Answers_Entertainment] (
[Name] nvarchar(max) NOT NULL,
[BornOn] datetime NULL,
[DiedOn] datetime NULL,
[Id] int NOT NULL
);
GO
-- --------------------------------------------------
-- Creating all PRIMARY KEY constraints
-- --------------------------------------------------
-- Creating primary key on [Id] in table 'Answers'
ALTER TABLE [dbo].[Answers]
ADD CONSTRAINT [PK_Answers]
PRIMARY KEY CLUSTERED ([Id] ASC);
GO
-- Creating primary key on [Id] in table 'Questions'
ALTER TABLE [dbo].[Questions]
ADD CONSTRAINT [PK_Questions]
PRIMARY KEY CLUSTERED ([Id] ASC);
GO
-- Creating primary key on [Id] in table 'Answers_Geography'
ALTER TABLE [dbo].[Answers_Geography]
ADD CONSTRAINT [PK_Answers_Geography]
PRIMARY KEY CLUSTERED ([Id] ASC);
GO
-- Creating primary key on [Id] in table 'Answers_Entertainment'
ALTER TABLE [dbo].[Answers_Entertainment]
ADD CONSTRAINT [PK_Answers_Entertainment]
PRIMARY KEY CLUSTERED ([Id] ASC);
GO
-- --------------------------------------------------
-- Creating all FOREIGN KEY constraints
-- --------------------------------------------------
-- Creating foreign key on [AnswerId] in table 'Questions'
ALTER TABLE [dbo].[Questions]
ADD CONSTRAINT [FK_QuestionAnswer]
FOREIGN KEY ([AnswerId])
REFERENCES [dbo].[Answers]
([Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
-- Creating non-clustered index for FOREIGN KEY 'FK_QuestionAnswer'
CREATE INDEX [IX_FK_QuestionAnswer]
ON [dbo].[Questions]
([AnswerId]);
GO
-- Creating foreign key on [Id] in table 'Answers_Geography'
ALTER TABLE [dbo].[Answers_Geography]
ADD CONSTRAINT [FK_Geography_inherits_Answer]
FOREIGN KEY ([Id])
REFERENCES [dbo].[Answers]
([Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
GO
-- Creating foreign key on [Id] in table 'Answers_Entertainment'
ALTER TABLE [dbo].[Answers_Entertainment]
ADD CONSTRAINT [FK_Entertainment_inherits_Answer]
FOREIGN KEY ([Id])
REFERENCES [dbo].[Answers]
([Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
GO