在代碼優先項目(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")
來指示哪些外鍵屬於反饋。
我說得對不對,如果我總結你的變化: - 重命名導航屬性'Feedbacks'成'ChildFeedbacks'; - 添加導航屬性'ParentFeedbacks',具有反向屬性'Consult'(我沒有添加,因爲我認爲我不需要它)。 因此,導航屬性ChildFeedbacks仍具有反饋作爲其反相屬性?我嘗試過,沒有成功。 –
我不確定您正在展示哪些內容以及您沒有看到什麼內容。我也不瞭解你想要建模的關係。你想要這樣的東西:http://stackoverflow.com/q/12252868/150342 – Colin
是的,這是或多或少。我只是想讓關係本身具有一些屬性,所以我就這樣定義了自己,而不是將它留給EF。 奇怪的是,生成的數據庫看起來像我的預期,創建和保存對象的工作如預期。它只是檢索不起作用的關係。 –