EF5代码优先:数据库ok,查询不正确

时间:2013-12-11 13:01:20

标签: c# sql entity-framework entity-framework-5

在代码第一个项目(EF5,MVC4)中,我有一个名为Consult的实体。它有一组注释,可以在自己的表中正确保存和检索。

咨询实体可用于收集其他咨询实体以获得反馈(应用程序的功能要求)。因此,Consult有一个导航属性Feedbacks,它是FeedbackRelation实体的列表,代表所选的Consult实体。此信息保存在FeedbackRelation表中,其中每个记录包含包含集合的Consult的ID,以及作为集合一部分的Consult的ID(以及一些简单的内务处理属性)。

Consult实体被定义为:

public class Consult
{
    public virtual Guid ID { get; set; }
    public virtual string Subject { get; set; }

    public virtual ICollection<Note> Notes { get; set; }

    [InverseProperty("Feedback")]
    public virtual ICollection<FeedbackRelation> Feedbacks { get; set; }
}

FeedbackRelation实体如下所示:

public class FeedbackRelation
{
    public Guid ID { get; set; }
    [Required]
    public virtual Guid FeedbackID { get; set; }
    [Required]
    public virtual Guid ConsultID { get; set; }

    [ForeignKey("FeedbackID")]
    public virtual Consult Feedback { get; set; }

    [ForeignKey("ConsultID")]
    public virtual Consult Consult { get; set; }
}

为清楚起见,遗漏了一些简单的(bool,string)属性。

创建一个Consult,并将其他Consult实体添加到Feedbacks列表中。所有数据都正确保存在数据库中。

检索Consult不会检索反馈。 Feedbacks.Count始终为零。

我在检索反馈时执行了发送到服务器的SQL。它看起来像这样:

exec sp_executesql N'SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[FeedbackID] AS [FeedbackID], 
[Extent1].[ConsultID] AS [ConsultID], 
FROM [dbo].[FeedbackRelation] AS [Extent1]
WHERE [Extent1].[FeedbackID] = @EntityKeyValue1',N'@EntityKeyValue1 uniqueidentifier',@EntityKeyValue1='58429806-CE36-4FDE-AD79-07E0872E3735'

更易读的形式是:

select * from FeedbackRelation where FeedbackID = '58429806-CE36-4FDE-AD79-07E0872E3735'

但应该是:

select * from FeedbackRelation where ConsultID = '58429806-CE36-4FDE-AD79-07E0872E3735'

对数据库执行此查询将返回预期结果。

为什么EF使用父记录的ID作为子ID的搜索参数?我已经给出了属性InverseProperty("Feedback")来指示哪个外键属于反馈。

1 个答案:

答案 0 :(得分:0)

您已指定Feedbacks导航属性在名为InverseProperty的{​​{1}}中有FeedbackRelation,并且您已指定Feedback属性具有外国名为Feedback的密钥。这意味着当您想要检索FeedbackID时,它应该使用Feedbacks检索它们。所以我不明白为什么你会期望它使用FeedbackID代替。

您似乎缺少ConsultID类中的第二个导航属性,我发现命名令人困惑。我希望这样的事情:

Consult