2016-08-02 12 views
0

Sagen wir ein Projekt mit dieser Entitäten:Entity Framework-Code zuerst, erhalten Sie Zugriff auf Fremdschlüsselwert

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

nun eine scenerio überlegen, wo ich alle Nachrichten erhalten möchten, dass ein bestimmter Benutzer geschrieben, wie kann man erreicht dies, ohne die Benutzerinformation auch zu ziehen? (ohne den Kontext zu verwenden.Users.Include (...))? Ich weiß, dass das Entitätsframework eine Spalte in der Nachrichtentabelle erstellt, die die ID des Benutzers enthält, der diese Nachricht gesendet hat, aber wie kann ich auf diesen Wert zugreifen? weil es keine Eigenschaft in meiner ursprünglichen Klasse ist.

Antwort

2

Sie können eine Navigationseigenschaft in die Message Klasse hinzufügen:

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

    public virtual User User { get; set; } 
} 

Und dann wie folgt abfragen Ihrem Kontext:

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

Dies ist aufgeräumter Art und Weise tun. Alternativ können Sie mit dem Benutzer starten, aber das ist ein wenig umständlich:

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

Beide Methoden werden letztlich die ähnliche SQL produzieren, etwa wie folgt:

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

Hey DavidG! Was ist der Unterschied zwischen der Verwendung der ForeignKey-Anmerkung, um sie nicht zu verwenden? –

+0

Es gibt wirklich keinen Unterschied, wenn Sie explizit sein möchten, dann können Sie es hinzufügen. Sie brauchen das Attribut tatsächlich nicht, da Entity Framework die Navigationseigenschaft "Benutzer" gemäß Konvention einem Id-Feld zuordnet namens 'UserId'. – DavidG

+0

Stellt dies eine Verbindung zwischen den beiden Entitäten her? löscht eine von ihnen die Löschung der anderen? –

0

Sie können explictly den FK definieren damit Sie das Benutzerobjekt nicht auflösen müssen.

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

Dann arbeiten Sie auf den Benutzer, wenn es nötig ist, aber wenn Sie nur durch UserID ziehen wollen oder die Benutzer-ID ändern können Sie dies tun.

+0

Hey Yushatak! Was ist der Unterschied zwischen der Verwendung der ForeignKey Annotation gegen die Nichtbenutzung (aber das Verlassen der virtuellen wie DavidG gepostet)? –

+0

Wenn Sie die Annotation verwenden, erstellen Sie eine Schlüsseleigenschaft * accessible * (in diesem Fall UserID), die Sie lesen/schreiben/bearbeiten können. Wenn Sie die Annotation nicht verwenden, passiert dies hinter den Kulissen und wird Ihnen nicht über EF zur Verfügung gestellt. – Yushatak

+0

Anscheinend ist das manuelle FK nicht notwendig, da der Ausdruck sowieso die Verwendung der ID-Eigenschaft in EF (nach DavidG) verrechnet. – Yushatak