我正在做一个简单的trivial pursuit game。我不确定是否(以及如何)我可以使用EF4执行以下操作: -
我有一个表结构如下。
=> ID
=> Unique Question
=> AnswerId
=> AnswerType (ie. Geography, Entertainment, etc).
=> ID
=> Place Name
=> LatLong
=> ID
=> Name
=> BordOn
=> DiedOn
=> Nationality .. and other meta data
...等..
因此,当一个人提出一个独特的问题时...存储的proc能够找出它的答案类型(即AnswerType字段)......因此查询正确的表。
EG.
SELECT @AnswerId = AnswerId, @AnswerType = AnswerType
FROM TrivialPursuitQuestions
WHERE UniqueQuestion = @Question
IF @AnswerId > 0 AND @AnswerType > 0 BEGIN
IF @AnswerType = 1
SELECT *
FROM GeographicAnswers
WHERE AnswerId = @AnswerID
IF @AnswerType = 2
SELECT *
FROM EntertainmentAnswer
WHERE AnswerId = @AnswerId
... etc ...
END
现在..我不知道如何用EF做到这一点。首先,存储过程现在可以返回MULTIPLE结果类型..所以我不确定这是不是真的很糟糕。
然后我想,也许存储过程应该返回Multiple Recordsets ..除了一个包含结果的记录集之外的所有记录集...因为按设计,只能找到一种答案类型...
EG.
-- Same SELECT as above...
IF @AnswerId > 0 BEGIN
SELECT *
FROM GeographicAnswers
WHERE AnswerId = CASE @AnswerId WHEN 1 THEN @AnswerID ELSE 0 END
SELECT *
FROM EntertainmentAnswer
WHERE AnswerId = CASE @AnswerId WHEN 2 THEN @AnswerID ELSE 0 END
... etc ...
END
这将返回6个(多个)记录集......但是其中只有一个应该有一些数据。
现在,如果这是一个更好的解决方案......这可能与EF4有关吗?
我正在努力避免两次往返数据库并且还要弄清楚要尝试和检索的东西......我不想弄清楚..我希望有一些聪明对系统建模非常聪明,可以说'OH!你这是正确答案'。有点像答案工厂(ala工厂模式),但有Sql Server + EF4。
任何人都有任何想法?
答案 0 :(得分:2)
在EF Designer中,您可以创建一个名为Answer
的实体,然后创建从GeographyAnswer
,EntertainmentAnswer
的答案派生的实体,......使用鉴别器AnswerType
答案实体中的 。添加Question
实体。将问题中的关联添加到Answer
,将其标记为1:1。让EF为您的数据库生成DDL。
现在,您可以question.Answer
获取Answer
的{{1}}。您可以查看Question
的类型并显示相应的用户界面。
尽管如此,这也引出了一个问题,如果问题与答案之间存在1:1的对应关系,为什么不拥有单个实体Answer
并从中派生出QuestionAnswer
,{{1} },...现在您可以轻松选择特定类型的QuestionAnswerGeography
:例如QuestionAnswerEntertainment
。
这是一个实体图,表示答案可能由多个问题共享:
此模型允许您执行以下查询:
Questions
此模型生成的DDL为: -
dataContext.QuestionAnswers.ofType<QuestionAnswerGeography>()