在代码第一个项目(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")
来指示哪个外键属于反馈。
答案 0 :(得分:0)
您已指定Feedbacks
导航属性在名为InverseProperty
的{{1}}中有FeedbackRelation
,并且您已指定Feedback
属性具有外国名为Feedback
的密钥。这意味着当您想要检索FeedbackID
时,它应该使用Feedbacks
检索它们。所以我不明白为什么你会期望它使用FeedbackID
代替。
您似乎缺少ConsultID
类中的第二个导航属性,我发现命名令人困惑。我希望这样的事情:
Consult