2013-12-11 47 views
0

在代碼優先項目(EF5,MVC4)中,我有一個名爲Consult的實體。它有一系列筆記,可以在自己的表格中正確保存和檢索。EF5代碼優先:數據庫好,查詢不正確

諮詢實體可用於收集其他諮詢實體以獲得反饋(應用程序的功能要求)。所以Consult有一個導航屬性Feedbacks,它是一個FeedbackRelation實體列表,代表所選的Consult實體。這些信息保存在一個FeedbackRelation表中,每個記錄包含了包含該集合的Consult的ID,以及作爲集合一部分的Consult的ID(以及一些簡單的內務處理屬性)。

的諮詢實體已經被定義爲:

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; } 
} 

一些簡單的(布爾,字符串)的屬性已經留出了清晰度。

創建諮詢,並將其他諮詢實體添加到反饋列表正在工作。所有數據都正確保存在數據庫中。

檢索諮詢不會檢索反饋。 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

您指定的Feedbacks導航屬性在FeedbackRelationInverseProperty命名Feedback,並且已指定了Feedback酒店有一個名爲FeedbackID的外鍵。這意味着當你想要檢索Feedbacks時,它應該使用FeedbackID檢索它們。所以我不明白你爲什麼會用它來代替ConsultID

您似乎錯過了Consult類中的第二個導航屬性,並且我發現命名混淆。我希望這樣的事情:

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

    //etc 

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

    [InverseProperty("Consult")] 
    public virtual ICollection<FeedbackRelation> ParentFeedbacks { get; set; } 
} 
+0

我說得對不對,如果我總結你的變化: - 重命名導航屬性'Feedbacks'成'ChildFeedbacks'; - 添加導航屬性'ParentFeedbacks',具有反向屬性'Consult'(我沒有添加,因爲我認爲我不需要它)。 因此,導航屬性ChildFeedbacks仍具有反饋作爲其反相屬性?我嘗試過,沒有成功。 –

+0

我不確定您正在展示哪些內容以及您沒有看到什麼內容。我也不瞭解你想要建模的關係。你想要這樣的東西:http://stackoverflow.com/q/12252868/150342 – Colin

+0

是的,這是或多或少。我只是想讓關係本身具有一些屬性,所以我就這樣定義了自己,而不是將它留給EF。 奇怪的是,生成的數據庫看起來像我的預期,創建和保存對象的工作如預期。它只是檢索不起作用的關係。 –

相關問題