这可以通过Entity Framework 4完成吗?如果没有,这可以做什么?

时间:2010-08-28 00:58:52

标签: sql-server entity-framework architecture entity-framework-4

我正在做一个简单的trivial pursuit game。我不确定是否(以及如何)我可以使用EF4执行以下操作: -

我有一个表结构如下。

表:TrivialPursuitQuestion

=> ID
=> Unique Question
=> AnswerId
=> AnswerType (ie. Geography, Entertainment, etc).

表:GeographyAnswer

=> ID
=> Place Name
=> LatLong

表:EntertainmentAnswer:

=> 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。

任何人都有任何想法?

1 个答案:

答案 0 :(得分:2)

在EF Designer中,您可以创建一个名为Answer的实体,然后创建从GeographyAnswerEntertainmentAnswer的答案派生的实体,......使用鉴别器AnswerType答案实体中的 。添加Question实体。将问题中的关联添加到Answer,将其标记为1:1。让EF为您的数据库生成DDL。

现在,您可以question.Answer获取Answer的{​​{1}}。您可以查看Question的类型并显示相应的用户界面。

尽管如此,这也引出了一个问题,如果问题与答案之间存在1:1的对应关系,为什么不拥有单个实体Answer并从中派生出QuestionAnswer,{{1} },...现在您可以轻松选择特定类型的QuestionAnswerGeography:例如QuestionAnswerEntertainment

这是一个实体图,表示答案可能由多个问题共享: alt text

此模型允许您执行以下查询:

Questions

此模型生成的DDL为: -

dataContext.QuestionAnswers.ofType<QuestionAnswerGeography>()