2016-08-02 96 views
0

說我們有這個實體的一個項目:實體框架代碼首先,可以訪問外鍵值

class User 
{ 
    public Guid Id { get; set; } 
    public List<Message> Messages { get; set; } 
    ... 
} 

class Message 
{ 
    public Guid Id { get; set; } 
    public string Message { get; set; } 
} 

現在考慮之情況,我想獲得的所有特定用戶發佈的消息,怎麼能一個人在不拉用戶信息的情況下實現這一點? (不使用context.Users.Include(...))? 我知道實體框架在Message表中創建了一個列,其中包含發佈此消息的用戶的Id,但我如何才能訪問此值?因爲它不是我原來的課程中的一個屬性。

回答

2

您可以添加導航屬性爲Message類:

public class Message 
{ 
    public Guid Id { get; set; } 
    public string Message { get; set; } 

    public virtual User User { get; set; } 
} 

,然後查詢你的背景是這樣的:

var userMessages = context.Messages 
    .Where(m => m.User.Id == 5); 

這是做它的整潔方式。或者,你可以與用戶開始,但是這是一個稍微尷尬:

var userMessages = context.Users 
    .Where(u => u.Id == 5) 
    .SelectMany(u => u.Messages); 

這兩種方法最終將產生類似SQL,這樣的事情:

SELECT [Extent1].[Column1], 
     [Extent1].[Column2], 
     [Extent1].[Column3] 
FROM [dbo].[Messages] AS [Extent1] 
WHERE 5 = [Extent1].[UserId] 
+0

嘿DavidG!使用ForeignKey註釋與不使用它有什麼區別? –

+0

實際上沒有區別,如果你想要顯式的話,可以隨意添加它。實際上你並不需要這個屬性,因爲按照慣例,實體框架將'User'導航屬性映射到Id字段稱爲'UserId'。 – DavidG

+0

這是否會在兩個實體之間創建任何連接?將刪除其中一個會導致另一個刪除? –

0

您可以顯式地定義FK這樣您就不必解析用戶對象。

class Message 
{ 
    public Guid Id { get; set; } 
    public string Message { get; set; } 

    public int UserID { get; set; } 
    [ForeignKey("UserID")] 
    public virtual User User { get; set; } 
} 

然後你在用戶操作時,你需要的,但如果你只是想通過用戶名拉或更改用戶名,你可以這樣做。

+0

Hey Yushatak!使用ForeignKey註釋與不使用它有什麼區別(但是讓虛擬像DavidG一樣)? –

+0

如果使用註釋,您可以創建一個* accessible * key屬性(在這種情況下爲UserID),您可以讀/寫/操作。如果您不使用註釋,這會發生在幕後,並且無法通過EF進行操作。 – Yushatak

+0

顯然手動FK並不是必須的,因爲表達式在EF(每個DavidG)中解析爲使用ID屬性。 – Yushatak